From ea25c759544d27567c469a9329734dd6e0854bd4 Mon Sep 17 00:00:00 2001 From: Kolja Schwenghagen Date: Wed, 6 Nov 2013 13:13:12 -0800 Subject: [PATCH 01/91] Improved 'Put user in course' and context menu for user list - Changed the table displaying the users of a certain course to display action options in a contet menu instead of creating a new row - Changed the layout of the 'Pu User in Cours' table to be searchable and have pagination --- app/controllers/users_controller.php | 27 ++++---- app/views/users/edit.ctp | 93 +++++++++++++++++++++++++--- app/views/users/go_to_class_list.ctp | 74 +++++++++++++--------- 3 files changed, 143 insertions(+), 51 deletions(-) diff --git a/app/controllers/users_controller.php b/app/controllers/users_controller.php index 2cecf7b4b..88dbe9bf9 100644 --- a/app/controllers/users_controller.php +++ b/app/controllers/users_controller.php @@ -686,16 +686,21 @@ public function edit($userId = null, $courseId = null) { } } - // create the enrolment entry depending on if instructor or student - // and also convert it into a CakePHP dark magic friendly format - if (!empty($this->data['Courses']['id'])) { - $enrolments = $this->_convertCourseEnrolment( - $this->data['Courses']['id'], - $this->data['Role']['RolesUser']['role_id'] - ); - } else { - $enrolments = array('Enrolment' => array()); - } + // create the enrolment entry depending on if instructor or student + // and also convert it into a CakePHP dark magic friendly format + $enrollment = explode("||", $this->data['Courses']['enrollment']); + foreach ($enrollment as $index => $val) { + $enrollment[$index] = str_replace("|", "", $val); + } + if (!empty($enrollment)) { + $enrolments = $this->_convertCourseEnrolment( + $enrollment, + $this->data['Role']['RolesUser']['role_id'] + ); + } else { + $enrolments = array('Enrolment' => array()); + } + $test = $this->data['Courses']; $this->data = array_merge($this->data, $enrolments); // Now we actually attempt to save the data @@ -1556,4 +1561,4 @@ private function _notUnenrolCourses($editor, $userId) return array_diff($userCourses, array_keys($editorCourses)); } -} +} \ No newline at end of file diff --git a/app/views/users/edit.ctp b/app/views/users/edit.ctp index 8c58c5658..55bece88b 100644 --- a/app/views/users/edit.ctp +++ b/app/views/users/edit.ctp @@ -25,18 +25,47 @@ if (User::hasPermission('functions/user/admin', 'update')) { } echo $this->Form->input('title'); echo $this->Form->input('student_no', array('label' => 'Student Number')); -echo $this->Form->input( - 'Courses.id', - array( - 'type' => 'select', - 'multiple' => 'checkbox', - 'options' => $coursesOptions, - 'label' => "Put User in Course", - 'selected' => $coursesSelected - ) -); +?> +
+ +
+ + + + + + + + + $row) { + ?> + + + + + + +
Course
Form->checkbox('Courses.id', array('value' => $key, 'hiddenField' => false, 'checked' => $checked, 'style' => 'width: 12px;', 'id' => 'course_'.$key)); + ?> + Form->label('Courses.id', $row, array('style' => 'width: 100%; float: none', 'for' => 'course_'.$key)); + ?> +
+
+
+
Form->submit('Save'); +echo $this->Form->hidden('Courses.enrollment'); ?>
Form->end(); @@ -75,3 +104,47 @@ jQuery('#RoleRolesUserRoleId').change(); "; } ?> + + \ No newline at end of file diff --git a/app/views/users/go_to_class_list.ctp b/app/views/users/go_to_class_list.ctp index 45d6b6404..3b7a3a767 100644 --- a/app/views/users/go_to_class_list.ctp +++ b/app/views/users/go_to_class_list.ctp @@ -43,29 +43,26 @@ foreach ($classList as $person) { function fnFormatDetails ( oTable, nTr ) { var aData = oTable.fnGetData( nTr ); - var sOut = '
'; + sOut += ''; + sOut += '
Drop'; + sOut += '
'; return sOut; } @@ -83,6 +80,7 @@ function resetConfirmed() } jQuery(document).ready(function() { + var elmnt = null; /* * Initialise DataTables, with no sorting on the 'details' column */ @@ -93,23 +91,39 @@ jQuery(document).ready(function() { ], "aaSorting" : [[1, 'asc']] }); - + /* Add event listener for opening and closing details * Note that the indicator for showing which row is open is not controlled by DataTables, * rather it is done here */ - jQuery('#table_id tbody td').live('click', function () { - var nTr = jQuery(this).parents('tr')[0]; - if ( oTable.fnIsOpen(nTr) ) - { - /* This row is already open - close it */ - oTable.fnClose( nTr ); + jQuery('#table_id tbody td').on('click', function (ev) { + if (elmnt) { + elmnt.remove(); + elmnt = null; } - else - { - /* Open this row */ - oTable.fnOpen( nTr, fnFormatDetails(oTable, nTr), 'userActionPanel' ); + else { + var nTr = jQuery(this).parents('tr')[0]; + elmnt = jQuery('
'); + elmnt.html(fnFormatDetails(oTable, nTr)); + elmnt.css({"background-color": "rgb(255, 255, 224)", "margin": "0px", "padding": "5px", "border": "1px solid", "position": "absolute"}); + elmnt.css("top", ev.pageY); + elmnt.css("left", ev.pageX); + elmnt.find("a").css({"text-decoration":"none", "color": "black"}); + elmnt.find("div").mouseover(function(){ + jQuery(this).css({"background-color": "rgb(173, 216, 230)"}); + }); + elmnt.find("div").mouseout(function(){ + jQuery(this).css({"background-color": "rgb(255, 255, 224)"}); + }); + jQuery(document.body).append(elmnt); } + ev.stopPropagation(); } ); + jQuery(document).on('click', function () { + if (elmnt) { + elmnt.remove(); + elmnt = null; + } + }); } ); - + \ No newline at end of file From b0ca2a6f77a618bbcf8dd6716cab5b1b8ca6fb33 Mon Sep 17 00:00:00 2001 From: Kolja Schwenghagen Date: Wed, 6 Nov 2013 13:24:22 -0800 Subject: [PATCH 02/91] Fixed a bug when the webroot is another directory than '/' The forms for mixed eval and simple surveys would generate the wrong URL when the application was installed in a subdirectory instead of the root of the webserver. --- app/views/evaluations/mixeval_eval_form.ctp | 2 +- app/views/evaluations/survey_eval_form.ctp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/evaluations/mixeval_eval_form.ctp b/app/views/evaluations/mixeval_eval_form.ctp index 352087f96..6409757c2 100644 --- a/app/views/evaluations/mixeval_eval_form.ctp +++ b/app/views/evaluations/mixeval_eval_form.ctp @@ -33,7 +33,7 @@ Form->create('EvaluationMixeval', array( - 'url' => $html->url('makeEvaluation') . '/'.$event['Event']['id'].'/'.$event['Group']['id']));?> + 'url' => 'makeEvaluation/'.$event['Event']['id'].'/'.$event['Group']['id']));?> "; ?> "; ?> "; ?> diff --git a/app/views/evaluations/survey_eval_form.ctp b/app/views/evaluations/survey_eval_form.ctp index bddfd4e26..82b0c5d30 100644 --- a/app/views/evaluations/survey_eval_form.ctp +++ b/app/views/evaluations/survey_eval_form.ctp @@ -6,7 +6,7 @@ if (!empty($event['Event']['description'])) { ?> ' . $event['Event']['title'] . ''; echo $form->create('SurveyInput', - array('url' => $html->url("makeEvaluation/$eventId"))); + array('url' => "makeEvaluation/$eventId")); foreach ($questions as $i => $q) { echo $html->div('prompt', $i + 1 .' '. $q['Question']['prompt']); From 4e834809a73d1ebc2fa7bfdebd7bfcfafafbd312 Mon Sep 17 00:00:00 2001 From: Kolja Schwenghagen Date: Wed, 6 Nov 2013 13:55:39 -0800 Subject: [PATCH 03/91] Fixed a bug when the webroot is another directory than '/' Also affected Survey question creation --- app/views/surveys/questionssummary.ctp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/views/surveys/questionssummary.ctp b/app/views/surveys/questionssummary.ctp index 97f82cb76..9946fe1bf 100644 --- a/app/views/surveys/questionssummary.ctp +++ b/app/views/surveys/questionssummary.ctp @@ -45,12 +45,13 @@ foreach ($questions as $i => $q) { ) ); } - +$addURL = $this->webroot.'surveys/addQuestion/'.$survey_id; +$doneURL = $this->webroot.'surveys/index'; echo $html->div('center', $form->button(__('Add Question', true), - array('onclick' => "window.location='/surveys/addQuestion/$survey_id'")). + array('onclick' => "window.location='$addURL'")). $form->button(__('Done', true), - array('onclick' => "window.location='/surveys/index'")) + array('onclick' => "window.location='$doneURL'")) ); ?>
From 63b31d680c219953eb2032eb7f044e27be1d43fb Mon Sep 17 00:00:00 2001 From: Kolja Schwenghagen Date: Thu, 7 Nov 2013 15:34:55 -0800 Subject: [PATCH 04/91] Fix for Ticket #517 - new check if any of the enrolled users role changed - if user information changed in BB it now gets updated in iPeer --- app/controllers/v1_controller.php | 56 +++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/app/controllers/v1_controller.php b/app/controllers/v1_controller.php index 4a1df6b4c..e1285eb40 100644 --- a/app/controllers/v1_controller.php +++ b/app/controllers/v1_controller.php @@ -347,7 +347,9 @@ public function users($id = null) { $data = array(); // rearrange the data foreach ($decode as $person) { - $pRole = array('Role' => array('RolesUser' => array('role_id' => $person['role_id']))); + // set the userId so the user data gets updats with values from BB + $person['id'] = $this->User->field('id', array('username' => $person['username'])); + $pRole = array('Role' => array('RolesUser' => array('role_id' => $person['role_id']))); unset($person['role_id']); // do some clean up before we insert the values array_walk($person, create_function('&$val', '$val = trim($val);')); @@ -996,6 +998,56 @@ public function enrolment() { $result[] = $user; } + // check if any user's role changed + else { + $userId = $this->User->field('id', array('username' => $user['username'])); + if (!empty($userId)) { + $role = $this->Role->getRoleName($user['role_id']); + + if ($role == 'instructor') { + if(in_array($userId, $students)) { + $this->User->removeStudent($userId, $courseId); + $this->log('Removing student '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addInstructor($userId, $courseId); + $this->log('Adding instructor '.$user['username'].' to course '.$courseId, 'api'); + } + else if(in_array($userId, $tutors)) { + $this->User->removeTutor($userId, $courseId); + $this->log('Removing tutor '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addInstructor($userId, $courseId); + $this->log('Adding instructor '.$user['username'].' to course '.$courseId, 'api'); + } + } + else if ($role == 'tutor') { + if(in_array($userId, $students)) { + $this->User->removeStudent($userId, $courseId); + $this->log('Removing student '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addTutor($userId, $courseId); + $this->log('Adding tutor '.$user['username'].' to course '.$courseId, 'api'); + } + else if(in_array($userId, $instructors)) { + $this->User->removeInstructor($userId, $courseId); + $this->log('Removing instructor '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addTutor($userId, $courseId); + $this->log('Adding tutor '.$user['username'].' to course '.$courseId, 'api'); + } + } + else if ($role == 'student') { + if(in_array($userId, $tutors)) { + $this->User->removeTutor($userId, $courseId); + $this->log('Removing tutor '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addStudent($userId, $courseId); + $this->log('Adding student '.$user['username'].' to course '.$courseId, 'api'); + } + else if(in_array($userId, $instructors)) { + $this->User->removeInstructor($userId, $courseId); + $this->log('Removing instructor '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addStudent($userId, $courseId); + $this->log('Adding student '.$user['username'].' to course '.$courseId, 'api'); + } + } + } + } } // unenrol students that are no longer in the class, this will become a problem if // only a fraction of the class list is given because the rest of the class will @@ -1083,4 +1135,4 @@ protected function getRequestInfo($request, $body) return $ret; } -} +} \ No newline at end of file From 7825c55a6c4fe86dae93aa8ca2aac61dcc49f02b Mon Sep 17 00:00:00 2001 From: Trevor Date: Fri, 8 Nov 2013 16:02:18 -0800 Subject: [PATCH 05/91] Daylight Savings Timezone (DST) Bug Fix - Added a basic time correction depending on whether or not daylight savings is in effect. - When daylight savings is not in effect, the time is off by 3600 seconds (1hr). - Added 5 test cases to test the different timezones (i.e. before DST, transition to DST, during DST, transition from DST, after DST). - event.test.php - changes timezones in order to check DST: 'America/Regina' doesn't have DST, 'America/Vancouver' has DST --- app/config/sql/ipeer_samples_data.sql | 10 +++++++++- app/models/event.php | 19 ++++++++++++++++++- .../controllers/courses_controller.test.php | 2 +- .../controllers/events_controller.test.php | 3 ++- .../controllers/home_controller.test.php | 6 +++--- app/tests/cases/models/event.test.php | 11 ++++++++++- 6 files changed, 43 insertions(+), 8 deletions(-) diff --git a/app/config/sql/ipeer_samples_data.sql b/app/config/sql/ipeer_samples_data.sql index aa807cd54..a1b120687 100644 --- a/app/config/sql/ipeer_samples_data.sql +++ b/app/config/sql/ipeer_samples_data.sql @@ -1157,7 +1157,15 @@ INSERT INTO events (id, title, course_id, description, event_template_type_id, t (7, 'simple evaluation 3', 1, '3rd simple evaluation for testing overdue event', 1, 1, '0', 0, 0, 1, '2012-11-28 00:00:00', '2012-11-20 00:00:00', '2012-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), (8, 'simple evaluation 4', 1, 'result released with submission', 1, 1, '0', 0, 0, 1, '2012-11-28 00:00:00', '2012-11-20 00:00:00', '2012-11-29 00:00:00', '2012-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), (9, 'simple evaluation 5', 1, 'result released with no submission', 1, 1, '0', 0, 0, 1, '2012-11-28 00:00:00', '2012-11-20 00:00:00', '2012-11-29 00:00:00', '2012-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), -(10, 'simple evaluation 6', 1, 'result released with no submission', 1, 1, '0', 0, 0, 1, CONCAT(YEAR(DATE_ADD(NOW(), INTERVAL 2 YEAR)), '-07-31 11:20:00'), CONCAT(YEAR(DATE_ADD(NOW(), INTERVAL 1 YEAR)), '-07-31 11:20:00'), CONCAT(YEAR(DATE_ADD(NOW(), INTERVAL 2 YEAR)), '-07-31 11:20:00'), CONCAT(YEAR(DATE_ADD(NOW(), INTERVAL 2 YEAR)), '-07-31 11:20:00'), CONCAT(YEAR(DATE_ADD(NOW(), INTERVAL 3 YEAR)), '-07-31 11:20:00'), 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'); +(10, 'simple evaluation 6', 1, 'result released with no submission', 1, 1, '0', 0, 0, 1, CONCAT(YEAR(DATE_ADD(NOW(), INTERVAL 2 YEAR)), '-07-31 11:20:00'), CONCAT(YEAR(DATE_ADD(NOW(), INTERVAL 1 YEAR)), '-07-31 11:20:00'), CONCAT(YEAR(DATE_ADD(NOW(), INTERVAL 2 YEAR)), '-07-31 11:20:00'), CONCAT(YEAR(DATE_ADD(NOW(), INTERVAL 2 YEAR)), '-07-31 11:20:00'), CONCAT(YEAR(DATE_ADD(NOW(), INTERVAL 3 YEAR)), '-07-31 11:20:00'), 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), +(11, 'timezone test A', 1, 'before DST', 1, 1, '0', 0, 0, 1, '2013-02-14 00:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), +(12, 'timezone test B', 1, 'transition to DST', 1, 1, '0', 0, 0, 1, '2013-03-10 02:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), +(13, 'timezone test C', 1, 'during DST', 1, 1, '0', 0, 0, 1, '2013-06-12 00:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), +(14, 'timezone test D', 1, 'transition from DST', 1, 1, '0', 0, 0, 1, '2013-11-03 02:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), +(15, 'timezone test E', 1, 'after DST', 1, 1, '0', 0, 0, 1, '2013-11-04 00:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), +--(16, 'timezone test B1', 1, 'missed time from transition to DST', 1, 1, '0', 0, 0, 1, '2013-03-10 02:30:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), +--(17, 'timezone test D1', 1, 'overlapped time from transition from DST', 1, 1, '0', 0, 0, 1, '2013-11-03 01:30:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13') +; -- -------------------------------------------------------- diff --git a/app/models/event.php b/app/models/event.php index f4db05992..8434dd29e 100644 --- a/app/models/event.php +++ b/app/models/event.php @@ -184,7 +184,24 @@ function __construct($id = false, $table = null, $ds = null) $this->virtualFields['student_count'] = sprintf('SELECT count(*) as count FROM group_events as vge RIGHT JOIN groups_members as vgm ON vge.group_id = vgm.group_id WHERE vge.event_id = %s.id', $this->alias); $this->virtualFields['group_count'] = sprintf('SELECT count(*) as count FROM group_events as vge WHERE vge.event_id = %s.id', $this->alias); $this->virtualFields['completed_count'] = sprintf('SELECT count(*) as count FROM evaluation_submissions as ves WHERE ves.submitted = 1 AND ves.event_id = %s.id', $this->alias); - $this->virtualFields['due_in'] = sprintf('TIMESTAMPDIFF(SECOND,"%s",due_date)', date('Y-m-d H:i:s')); + + /** + * The following does time correction for daylight savings. + * SQL does not recognize daylight savings, therefore when not in a daylight savings period, the timezone is 1hr (3600s) behind the actual time. + * NOTE: UNIX_TIMESTAMP() appears to work, but online sources say otherwise. + */ + + $dueIn = ""; + if(date('I') == 1){ + $dueIn = date('Y-m-d H:i:s', time()); + } + else{ + $dueIn = date('Y-m-d H:i:s', time() + 3600); + } + $this->virtualFields['due_in'] = sprintf('TIMESTAMPDIFF(SECOND,"%s",due_date)', $dueIn); + + //$this->virtualFields['due_in'] = sprintf('UNIX_TIMESTAMP(due_date) - UNIX_TIMESTAMP("%s")', date('Y-m-d H:i:s')); + //$this->virtualFields['due_in'] = sprintf('TIMESTAMPDIFF(SECOND,"%s",due_date)', date('Y-m-d H:i:s')); } /** diff --git a/app/tests/cases/controllers/courses_controller.test.php b/app/tests/cases/controllers/courses_controller.test.php index 822807b46..ce6e4e7df 100644 --- a/app/tests/cases/controllers/courses_controller.test.php +++ b/app/tests/cases/controllers/courses_controller.test.php @@ -354,7 +354,7 @@ function testHome() $this->assertEqual($result['data']['Course']['course'], $this->fixtureView['Course'][0]['course']); $this->assertEqual($result['data']['Course']['title'], $this->fixtureView['Course'][0]['title']); $this->assertEqual(count($result['data']['Group']), 2); - $this->assertEqual(count($result['data']['Event']), 10); + $this->assertEqual(count($result['data']['Event']), 15); $this->assertEqual($result['title_for_layout'], $this->fixtureView['Course'][0]['course'].' - '.$this->fixtureView['Course'][0]['title']); } diff --git a/app/tests/cases/controllers/events_controller.test.php b/app/tests/cases/controllers/events_controller.test.php index 20fc8983e..71c19d80a 100644 --- a/app/tests/cases/controllers/events_controller.test.php +++ b/app/tests/cases/controllers/events_controller.test.php @@ -84,9 +84,10 @@ function testIndex() { $result = $this->testAction('/events/index', array('return' => 'vars')); $this->assertEqual(count($result["paramsForList"]['data']['entries']), - 10); + 15); $this->assertEqual(sort(Set::extract($result["paramsForList"]['data']['entries'], '/Event/id')), array(1,2,3,6)); $events = Set::sort($result["paramsForList"]['data']['entries'], '{n}.Event.id', 'asc'); + $this->assertEqual($events[0]['Event']['Title'], 'Term 1 Evaluation'); $this->assertEqual($events[0]['Event']['event_template_type_id'], 1); $this->assertEqual($events[0]['Course']['course'], 'MECH 328'); diff --git a/app/tests/cases/controllers/home_controller.test.php b/app/tests/cases/controllers/home_controller.test.php index ab2bbc981..0b2d73a9f 100644 --- a/app/tests/cases/controllers/home_controller.test.php +++ b/app/tests/cases/controllers/home_controller.test.php @@ -90,7 +90,7 @@ function testIndex() $this->assertEqual(count($activeCourses[0]['Instructor']), 2); $this->assertEqual(count($activeCourses[0]['Event']), 0); $this->assertEqual(count($activeCourses[1]['Instructor']), 1); - $this->assertEqual(count($activeCourses[1]['Event']), 10); + $this->assertEqual(count($activeCourses[1]['Event']), 15); $this->assertEqual(count($inactiveCourses[0]['Instructor']), 1); $this->assertEqual(count($inactiveCourses[0]['Event']), 0); } @@ -108,7 +108,7 @@ function testIndexInstructor() $this->assertFalse(isset($result['course_list']['I'])); $activeCourses = $result['course_list']['A']; $this->assertEqual(count($activeCourses[0]['Instructor']), 1); - $this->assertEqual(count($activeCourses[0]['Event']), 10); + $this->assertEqual(count($activeCourses[0]['Event']), 15); // make sure the inactive courses are listed correctly $this->login = array( @@ -144,7 +144,7 @@ function testIndexFacultyAdmin() // test that course information is correct for MECH 328 $activeCourses = $result['course_list']['A']; $this->assertEqual(count($activeCourses[1]['Instructor']), 1); - $this->assertEqual(count($activeCourses[1]['Event']), 10); + $this->assertEqual(count($activeCourses[1]['Event']), 15); } function testIndexStudent() diff --git a/app/tests/cases/models/event.test.php b/app/tests/cases/models/event.test.php index f3df4cb10..ced8304d1 100644 --- a/app/tests/cases/models/event.test.php +++ b/app/tests/cases/models/event.test.php @@ -91,7 +91,7 @@ function testGetCourseEventCount() //Test a valid course number $course = $this->Event->getCourseEventCount(1); - $this->assertEqual($course, 10); + $this->assertEqual($course, 15); //Test an invalid course number $course = $this->Event->getCourseEventCount(999); @@ -339,9 +339,18 @@ function testTimezone() $event = $this->Event->findById(1); $dueDate = strtotime($event['Event']['due_date']); $dueIn = $dueDate - $now; + $serverTZ = date_default_timezone_get(); // saves the server's timezone // the difference between the our calculuation and the model's calcualtion // should be within 5 seconds $this->assertWithinMargin($event['Event']['due_in'], $dueIn, 5); + // switch to timezone without daylight savings + date_default_timezone_set('America/Regina'); + $this->assertWithinMargin($event['Event']['due_in'], $dueIn, 5); + // switch to timezone with daylight savings + date_default_timezone_set('America/Vancouver'); + $this->assertWithinMargin($event['Event']['due_in'], $dueIn, 5); + // switch timezone back to original + date_default_timezone_set($serverTZ); } ##################################################################################################################################################### From 1098d898fa5258966d58fa396fcef09a897d1152 Mon Sep 17 00:00:00 2001 From: Trevor Date: Fri, 8 Nov 2013 16:58:42 -0800 Subject: [PATCH 06/91] Daylight Savigns Timezone (DST) Bug Fix - Added code to adjust to DST. Before if not in DST, the time is off by 3600 seconds (1hr). - Added 5 test cases to the 'events' database to test the different scenarios (i.e. before DST, transition to DST, during DST, transition from DST, after DST). - event.test.php: sets and tests different timezones (i.e. 'America/Regina' doesn't have DST, 'America/Vancouver' has DST) --- app/config/sql/ipeer_samples_data.sql | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/config/sql/ipeer_samples_data.sql b/app/config/sql/ipeer_samples_data.sql index a1b120687..08ef1edc5 100644 --- a/app/config/sql/ipeer_samples_data.sql +++ b/app/config/sql/ipeer_samples_data.sql @@ -1162,10 +1162,7 @@ INSERT INTO events (id, title, course_id, description, event_template_type_id, t (12, 'timezone test B', 1, 'transition to DST', 1, 1, '0', 0, 0, 1, '2013-03-10 02:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), (13, 'timezone test C', 1, 'during DST', 1, 1, '0', 0, 0, 1, '2013-06-12 00:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), (14, 'timezone test D', 1, 'transition from DST', 1, 1, '0', 0, 0, 1, '2013-11-03 02:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), -(15, 'timezone test E', 1, 'after DST', 1, 1, '0', 0, 0, 1, '2013-11-04 00:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), ---(16, 'timezone test B1', 1, 'missed time from transition to DST', 1, 1, '0', 0, 0, 1, '2013-03-10 02:30:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), ---(17, 'timezone test D1', 1, 'overlapped time from transition from DST', 1, 1, '0', 0, 0, 1, '2013-11-03 01:30:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13') -; +(15, 'timezone test E', 1, 'after DST', 1, 1, '0', 0, 0, 1, '2013-11-04 00:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'); -- -------------------------------------------------------- From 88d809d57a7cfa7d963f81a0d72ef922f18ecff4 Mon Sep 17 00:00:00 2001 From: Trevor Date: Tue, 12 Nov 2013 14:06:52 -0800 Subject: [PATCH 07/91] Working Timezone Test Cases - Added two test cases to test timezone daylight savings. - The first test case occurs during the time daylight savings skips (i.e. 2013-03-10 02:30:00 'America/Vancouver' time). - The second test case occurs during the time daylight savings repeats (i.e. 2013-11-03 01:30:00 'America/Vancouver' time). --- app/config/sql/ipeer_samples_data.sql | 4 ++-- app/tests/cases/controllers/courses_controller.test.php | 2 +- app/tests/cases/controllers/home_controller.test.php | 6 +++--- app/tests/cases/models/event.test.php | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/config/sql/ipeer_samples_data.sql b/app/config/sql/ipeer_samples_data.sql index a1b120687..10116fd04 100644 --- a/app/config/sql/ipeer_samples_data.sql +++ b/app/config/sql/ipeer_samples_data.sql @@ -1163,8 +1163,8 @@ INSERT INTO events (id, title, course_id, description, event_template_type_id, t (13, 'timezone test C', 1, 'during DST', 1, 1, '0', 0, 0, 1, '2013-06-12 00:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), (14, 'timezone test D', 1, 'transition from DST', 1, 1, '0', 0, 0, 1, '2013-11-03 02:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), (15, 'timezone test E', 1, 'after DST', 1, 1, '0', 0, 0, 1, '2013-11-04 00:00:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), ---(16, 'timezone test B1', 1, 'missed time from transition to DST', 1, 1, '0', 0, 0, 1, '2013-03-10 02:30:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), ---(17, 'timezone test D1', 1, 'overlapped time from transition from DST', 1, 1, '0', 0, 0, 1, '2013-11-03 01:30:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13') +(16, 'timezone test B1', 1, 'missed time from transition to DST', 1, 1, '0', 0, 0, 1, '2013-03-10 02:30:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13'), +(17, 'timezone test D1', 1, 'overlapped time from transition from DST', 1, 1, '0', 0, 0, 1, '2013-11-03 01:30:00', '2012-11-20 00:00:00', '2022-11-29 00:00:00', '2022-11-30 00:00:00', '2022-12-12 00:00:00', 'A', 1, '2012-11-21 12:23:13', 1, '2012-11-21 12:23:13') ; -- -------------------------------------------------------- diff --git a/app/tests/cases/controllers/courses_controller.test.php b/app/tests/cases/controllers/courses_controller.test.php index ce6e4e7df..5a91df1d8 100644 --- a/app/tests/cases/controllers/courses_controller.test.php +++ b/app/tests/cases/controllers/courses_controller.test.php @@ -354,7 +354,7 @@ function testHome() $this->assertEqual($result['data']['Course']['course'], $this->fixtureView['Course'][0]['course']); $this->assertEqual($result['data']['Course']['title'], $this->fixtureView['Course'][0]['title']); $this->assertEqual(count($result['data']['Group']), 2); - $this->assertEqual(count($result['data']['Event']), 15); + $this->assertEqual(count($result['data']['Event']), 17); $this->assertEqual($result['title_for_layout'], $this->fixtureView['Course'][0]['course'].' - '.$this->fixtureView['Course'][0]['title']); } diff --git a/app/tests/cases/controllers/home_controller.test.php b/app/tests/cases/controllers/home_controller.test.php index 0b2d73a9f..ccca0f6be 100644 --- a/app/tests/cases/controllers/home_controller.test.php +++ b/app/tests/cases/controllers/home_controller.test.php @@ -90,7 +90,7 @@ function testIndex() $this->assertEqual(count($activeCourses[0]['Instructor']), 2); $this->assertEqual(count($activeCourses[0]['Event']), 0); $this->assertEqual(count($activeCourses[1]['Instructor']), 1); - $this->assertEqual(count($activeCourses[1]['Event']), 15); + $this->assertEqual(count($activeCourses[1]['Event']), 17); $this->assertEqual(count($inactiveCourses[0]['Instructor']), 1); $this->assertEqual(count($inactiveCourses[0]['Event']), 0); } @@ -108,7 +108,7 @@ function testIndexInstructor() $this->assertFalse(isset($result['course_list']['I'])); $activeCourses = $result['course_list']['A']; $this->assertEqual(count($activeCourses[0]['Instructor']), 1); - $this->assertEqual(count($activeCourses[0]['Event']), 15); + $this->assertEqual(count($activeCourses[0]['Event']), 17); // make sure the inactive courses are listed correctly $this->login = array( @@ -144,7 +144,7 @@ function testIndexFacultyAdmin() // test that course information is correct for MECH 328 $activeCourses = $result['course_list']['A']; $this->assertEqual(count($activeCourses[1]['Instructor']), 1); - $this->assertEqual(count($activeCourses[1]['Event']), 15); + $this->assertEqual(count($activeCourses[1]['Event']), 17); } function testIndexStudent() diff --git a/app/tests/cases/models/event.test.php b/app/tests/cases/models/event.test.php index ced8304d1..55f201b88 100644 --- a/app/tests/cases/models/event.test.php +++ b/app/tests/cases/models/event.test.php @@ -91,7 +91,7 @@ function testGetCourseEventCount() //Test a valid course number $course = $this->Event->getCourseEventCount(1); - $this->assertEqual($course, 15); + $this->assertEqual($course, 17); //Test an invalid course number $course = $this->Event->getCourseEventCount(999); From 04958b914e2430b95111ba1f4fdeafc85d66f0b3 Mon Sep 17 00:00:00 2001 From: Trevor Date: Wed, 13 Nov 2013 11:14:02 -0800 Subject: [PATCH 08/91] Updated Daylight Savings Test Cases - Adjusted the pageSize parameter in 'ajax_list.php' from 15 to 20 in order for the test cases to read in more than 15 values. - Added two test cases to test for 'illegal' timezone times. - Tests the hour skipped due to daylight savings and tests the hour repeated due to daylight savings. --- app/controllers/components/ajax_list.php | 2 +- app/tests/cases/controllers/events_controller.test.php | 2 +- app/tests/cases/controllers/sysparameters_controller.test.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/components/ajax_list.php b/app/controllers/components/ajax_list.php index d8084c8d1..dc3e9fe91 100644 --- a/app/controllers/components/ajax_list.php +++ b/app/controllers/components/ajax_list.php @@ -120,7 +120,7 @@ function getState() $state = new Object(); $state->sortBy = $this->sortBy; $state->sortAsc = true; - $state->pageSize = 15; + $state->pageSize = 20; $state->pageShown = 1; $state->searchValue = ""; $state->searchBy = $this->searchBy; diff --git a/app/tests/cases/controllers/events_controller.test.php b/app/tests/cases/controllers/events_controller.test.php index 71c19d80a..8ebd58bbc 100644 --- a/app/tests/cases/controllers/events_controller.test.php +++ b/app/tests/cases/controllers/events_controller.test.php @@ -84,7 +84,7 @@ function testIndex() { $result = $this->testAction('/events/index', array('return' => 'vars')); $this->assertEqual(count($result["paramsForList"]['data']['entries']), - 15); + 17); $this->assertEqual(sort(Set::extract($result["paramsForList"]['data']['entries'], '/Event/id')), array(1,2,3,6)); $events = Set::sort($result["paramsForList"]['data']['entries'], '{n}.Event.id', 'asc'); diff --git a/app/tests/cases/controllers/sysparameters_controller.test.php b/app/tests/cases/controllers/sysparameters_controller.test.php index f8a4c55c2..28e5fccef 100644 --- a/app/tests/cases/controllers/sysparameters_controller.test.php +++ b/app/tests/cases/controllers/sysparameters_controller.test.php @@ -75,7 +75,7 @@ public function getController() // This code may be copied from SysParameter, need to be changed function testIndex() { $result = $this->testAction('/sysparameters/index', array('return' => 'vars')); - $this->assertEqual(count($result['paramsForList']['data']['entries']), 15); + $this->assertEqual(count($result['paramsForList']['data']['entries']), 17); $this->assertEqual($result['paramsForList']['data']['entries'][0]['SysParameter']['parameter_code'], 'system.super_admin'); $this->assertEqual($result['paramsForList']['data']['entries'][0]['SysParameter']['parameter_value'], 'root'); $this->assertEqual($result['paramsForList']['data']['entries'][0]['SysParameter']['parameter_type'], 'S'); From 2496ec5c1c16d06a90013253c870b396adfad593 Mon Sep 17 00:00:00 2001 From: Trevor Date: Wed, 13 Nov 2013 14:44:49 -0800 Subject: [PATCH 09/91] 'Enhancement' #516 - Allow Duplicate Event Title - Commented out the code that prevented the creation of events with the same name as an already existing event. --- app/models/evaluation_base.php | 4 ++++ app/views/events/add.ctp | 3 +++ app/views/events/edit.ctp | 3 +++ 3 files changed, 10 insertions(+) diff --git a/app/models/evaluation_base.php b/app/models/evaluation_base.php index 403911baa..993c14675 100644 --- a/app/models/evaluation_base.php +++ b/app/models/evaluation_base.php @@ -56,9 +56,13 @@ function beforeSave() str_replace("'", "", $this->data[$this->name]['name']); //check the duplicate name + // Removed for enhancement #516 - "Allow duplicate event title" + /* if (empty($this->data[$this->name]['id']) && !$this->__checkDuplicateName()) { return false; } + */ + //check if questions are entered if (!empty($this->data['Question'])&&$this->name =='Mixeval') { foreach ($this->data['Question'] as $row) { diff --git a/app/views/events/add.ctp b/app/views/events/add.ctp index c2659a2a8..e80e2e026 100644 --- a/app/views/events/add.ctp +++ b/app/views/events/add.ctp @@ -137,6 +137,8 @@ echo ""; echo $this->Form->submit(); echo $this->Form->end(); +// Removed for enhancement #516 - "Allow duplicate event title" +/* echo $ajax->observeField( 'EventTitle', array( @@ -147,6 +149,7 @@ echo $ajax->observeField( 'complete'=>"Element.hide('loading');stripe();" ) ); +*/ ?> diff --git a/app/views/events/edit.ctp b/app/views/events/edit.ctp index 202639e69..c6d03d83c 100644 --- a/app/views/events/edit.ctp +++ b/app/views/events/edit.ctp @@ -171,6 +171,8 @@ echo ""; echo $this->Form->submit(); echo $this->Form->end(); +// Removed for enhancement #516 - "Allow duplicate event title" +/* echo $ajax->observeField( 'EventTitle', array( @@ -181,6 +183,7 @@ echo $ajax->observeField( 'complete'=>"Element.hide('loading');stripe();" ) ); +*/ ?> From bfa39d3b41c0e58ce12ed9ccba12e4e578e2aa30 Mon Sep 17 00:00:00 2001 From: Trevor Date: Thu, 14 Nov 2013 14:57:50 -0800 Subject: [PATCH 10/91] Enhancement #520 - hide marks on evaluations - This enhancement allows the evaluation marks to be hidden/shown to users. - The marks can be hidden for mixed evaluations and rubrics. - The marks can be hidden by checking the checkbox that appears. - Upgraded the database to version 7. - This version adds a single column to 'rubrics_critereas' and 'mixeval_questions' to signify whether or not to hide/show marks. --- app/config/core.php | 2 +- app/config/sql/delta_7.sql | 11 +++++++++ app/config/sql/ipeer.sql | 4 +++- app/config/sql/ipeer_samples_data.sql | 24 ++++++++++--------- .../elements/mixevals/questions_editor.ctp | 4 ++++ .../mixevals/view_mixeval_details.ctp | 17 +++++++++++++ .../elements/rubrics/ajax_rubric_edit.ctp | 3 +++ .../elements/rubrics/ajax_rubric_view.ctp | 6 +++-- 8 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 app/config/sql/delta_7.sql diff --git a/app/config/core.php b/app/config/core.php index 3d171a75c..1dbc36b4c 100644 --- a/app/config/core.php +++ b/app/config/core.php @@ -319,7 +319,7 @@ /** * iPeer database version */ - Configure::write('DATABASE_VERSION', 6); + Configure::write('DATABASE_VERSION', 7); $CWL['LoginURL'] = 'https://www.auth.cwl.ubc.ca/auth/login'; diff --git a/app/config/sql/delta_7.sql b/app/config/sql/delta_7.sql new file mode 100644 index 000000000..ab30bba4d --- /dev/null +++ b/app/config/sql/delta_7.sql @@ -0,0 +1,11 @@ +-- This file contains queries that add a single column to two tables. +-- This column is used to hide/show the evaluation marks to the user. + +ALTER TABLE mixeval_questions ADD show_marks INT(1) AFTER scale_level; +ALTER TABLE rubrics_criterias ADD show_marks INT(1) AFTER multiplier; + +-- Update database version, done as the very last operation as a sign that +-- the update went well. +INSERT INTO `sys_parameters` (`parameter_code`, `parameter_value`, `parameter_type`, `description`, `record_status`, `creator_id`, `created`, `updater_id`, `modified`) VALUES +('database.version', '7', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()); + diff --git a/app/config/sql/ipeer.sql b/app/config/sql/ipeer.sql index 340e2d12a..7731a4d72 100644 --- a/app/config/sql/ipeer.sql +++ b/app/config/sql/ipeer.sql @@ -1065,6 +1065,7 @@ CREATE TABLE IF NOT EXISTS `mixeval_questions` ( `self_eval` tinyint(1) NOT NULL DEFAULT '0', `multiplier` int(11) NOT NULL DEFAULT '0', `scale_level` int(11) NOT NULL DEFAULT '0', + `show_marks` int(1) DEFAULT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`mixeval_question_type_id`) REFERENCES `mixeval_question_types` (`id`) ON DELETE CASCADE, @@ -1306,6 +1307,7 @@ CREATE TABLE IF NOT EXISTS `rubrics_criterias` ( `criteria_num` int(11) NOT NULL DEFAULT '999', `criteria` varchar(255) DEFAULT NULL, `multiplier` int(11) NOT NULL DEFAULT '0', + `show_marks` int(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -1480,7 +1482,7 @@ INSERT INTO `sys_parameters` (`parameter_code`, `parameter_value`, `parameter_ty ('system.admin_email', 'Please enter the iPeer administrator\\''s email address.', 'S', NULL, 'A', 0, NOW(), NULL, NOW()), ('display.date_format', 'D, M j, Y g:i a', 'S', 'date format preference', 'A', 0, NOW(), NULL, NOW()), ('system.version', '3.1.0', 'S', NULL, 'A', 0, NOW(), NULL, NOW()), -('database.version', '6', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()), +('database.version', '7', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()), ('email.port', '25', 'S', 'port number for email smtp option', 'A', '0', NOW(), NULL , NOW()), ('email.host', 'localhost', 'S', 'host address for email smtp option', 'A', '0', NOW(), NULL , NOW()), ('email.username', '', 'S', 'username for email smtp option', 'A', '0', NOW(), NULL , NOW()), diff --git a/app/config/sql/ipeer_samples_data.sql b/app/config/sql/ipeer_samples_data.sql index 10116fd04..1731288f9 100644 --- a/app/config/sql/ipeer_samples_data.sql +++ b/app/config/sql/ipeer_samples_data.sql @@ -1331,6 +1331,7 @@ CREATE TABLE IF NOT EXISTS `mixeval_questions` ( `self_eval` tinyint(1) NOT NULL DEFAULT '0', `multiplier` int(11) NOT NULL DEFAULT '0', `scale_level` int(11) NOT NULL DEFAULT '0', + `show_marks` int(1) DEFAULT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`mixeval_question_type_id`) REFERENCES `mixeval_question_types` (`id`) ON DELETE CASCADE, @@ -1342,13 +1343,13 @@ CREATE TABLE IF NOT EXISTS `mixeval_questions` ( -- Dumping data for table `mixeval_questions` -- -INSERT INTO `mixeval_questions` (`id`, `mixeval_id`, `question_num`, `title`, `instructions`, `mixeval_question_type_id`, `required`, `self_eval`, `multiplier`, `scale_level`) VALUES -(1, 1, 1, 'Participated in Team Meetings', "Please rate performance.", 1, 1, 0, 1, 5), -(2, 1, 2, 'Was Helpful and co-operative', NULL, 1, 1, 0, 1, 5), -(3, 1, 3, 'Submitted work on time', NULL, 1, 1, 0, 1, 5), -(4, 1, 4, 'Produced efficient work?', NULL, 3, 1, 0, 0, 5), -(5, 1, 5, 'Contributed?', "Please give a paragraph answer.", 2, 1, 0, 0, 5), -(6, 1, 6, 'Easy to work with?', NULL, 3, 0, 0, 0, 5); +INSERT INTO `mixeval_questions` (`id`, `mixeval_id`, `question_num`, `title`, `instructions`, `mixeval_question_type_id`, `required`, `self_eval`, `multiplier`, `scale_level`, `show_marks`) VALUES +(1, 1, 1, 'Participated in Team Meetings', "Please rate performance.", 1, 1, 0, 1, 5, 1), +(2, 1, 2, 'Was Helpful and co-operative', NULL, 1, 1, 0, 1, 5, 0), +(3, 1, 3, 'Submitted work on time', NULL, 1, 1, 0, 1, 5, 1), +(4, 1, 4, 'Produced efficient work?', NULL, 3, 1, 0, 0, 5, NULL), +(5, 1, 5, 'Contributed?', "Please give a paragraph answer.", 2, 1, 0, 0, 5, NULL), +(6, 1, 6, 'Easy to work with?', NULL, 3, 0, 0, 0, 5, NULL); -- -------------------------------------------------------- @@ -1747,6 +1748,7 @@ CREATE TABLE IF NOT EXISTS `rubrics_criterias` ( `criteria_num` int(11) NOT NULL DEFAULT '999', `criteria` varchar(255) DEFAULT NULL, `multiplier` int(11) NOT NULL DEFAULT '0', + `show_marks` int(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -1754,9 +1756,9 @@ CREATE TABLE IF NOT EXISTS `rubrics_criterias` ( -- Dumping data for table `rubrics_criterias` -- -INSERT INTO `rubrics_criterias` VALUES (1, 1, 1, 'Participated in Team Meetings', 5); -INSERT INTO `rubrics_criterias` VALUES (2, 1, 2, 'Was Helpful and Co-operative', 5); -INSERT INTO `rubrics_criterias` VALUES (3, 1, 3, 'Submitted Work on Time', 5); +INSERT INTO `rubrics_criterias` VALUES (1, 1, 1, 'Participated in Team Meetings', 5, 0); +INSERT INTO `rubrics_criterias` VALUES (2, 1, 2, 'Was Helpful and Co-operative', 5, 1); +INSERT INTO `rubrics_criterias` VALUES (3, 1, 3, 'Submitted Work on Time', 5, 1); -- -------------------------------------------------------- @@ -2010,7 +2012,7 @@ INSERT INTO `sys_parameters` (`parameter_code`, `parameter_value`, `parameter_ty ('system.admin_email', 'Please enter the iPeer administrator\\''s email address.', 'S', NULL, 'A', 0, NOW(), NULL, NOW()), ('display.date_format', 'D, M j, Y g:i a', 'S', 'date format preference', 'A', 0, NOW(), NULL, NOW()), ('system.version', '3.1.0', 'S', NULL, 'A', 0, NOW(), NULL, NOW()), -('database.version', '6', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()), +('database.version', '7', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()), ('email.port', '25', 'S', 'port number for email smtp option', 'A', '0', NOW(), NULL , NOW()), ('email.host', 'localhost', 'S', 'host address for email smtp option', 'A', '0', NOW(), NULL , NOW()), ('email.username', '', 'S', 'username for email smtp option', 'A', '0', NOW(), NULL , NOW()), diff --git a/app/views/elements/mixevals/questions_editor.ctp b/app/views/elements/mixevals/questions_editor.ctp index 0e09e6f56..bf6afd4d9 100644 --- a/app/views/elements/mixevals/questions_editor.ctp +++ b/app/views/elements/mixevals/questions_editor.ctp @@ -129,6 +129,10 @@ function likertFields($view, $i) { array('label' => 'Marks')); $ret .= $html->div("help-text", _t('This mark will be scaled according to the response. E.g.: If there are 5 scale levels and this is set at 1, the lowest scale will be worth 0.2 marks, the second lowest 0.4 marks, and so on with the highest scale being worth the full 1 mark.')); + $ret .= $form->input("MixevalQuestion.$i.show_marks", + array('label' => 'Show Marks', 'type' => 'checkbox')); + $ret .= $html->div("help-text", + _t('This setting will hide/show the mark distribution to those taking the evaluation.')); $ret .= $html->div('', $form->label(null, 'Scale', array('class' => 'defLabel')) . $form->button("Add", array('type' => 'button', diff --git a/app/views/elements/mixevals/view_mixeval_details.ctp b/app/views/elements/mixevals/view_mixeval_details.ctp index fd3edf508..8147ff84d 100644 --- a/app/views/elements/mixevals/view_mixeval_details.ctp +++ b/app/views/elements/mixevals/view_mixeval_details.ctp @@ -72,13 +72,30 @@ foreach ($questions as $ques) { } $lom = (isset($details[$num])) ? $details[$num]['selected_lom'] : ''; $selected = ""; + + // Enhancement #520 - "hide" numerical designations of categories + // Depending on setting shows/hides marks + if($ques['MixevalQuestion']['show_marks'] == 0){ + $showMarks = false; + } + else{ + $showMarks = true; + } + $questionContent = $html->tableCells($descs) . $html->tableCells($options); + if($showMarks){ + $questionContent .= $html->tableCells($marks); + } + $output = $html->div('MixevalQuestion', $title . $instruct . $html->tag('table', + $questionContent + /* $html->tableCells($descs) . $html->tableCells($options) . $html->tableCells($marks) + */ ) ); $output = $output.$selected; diff --git a/app/views/elements/rubrics/ajax_rubric_edit.ctp b/app/views/elements/rubrics/ajax_rubric_edit.ctp index d21e5ae22..dc5ce31a9 100644 --- a/app/views/elements/rubrics/ajax_rubric_edit.ctp +++ b/app/views/elements/rubrics/ajax_rubric_edit.ctp @@ -41,6 +41,9 @@ $default_options = array('type' => 'text',
Form->input('RubricsCriteria.'.$i.'.criteria', $default_options)?> Form->input('RubricsCriteria.'.$i.'.id', array('type' => 'hidden'))?> Form->input('RubricsCriteria.'.$i.'.criteria_num', array('type' => 'hidden', 'value' => $i+1))?> + +
+ Form->input('RubricsCriteria.'.$i.'.show_marks', array('label' => '', 'type' => 'checkbox', 'title' => $helptext))?>
diff --git a/app/views/elements/rubrics/ajax_rubric_view.ctp b/app/views/elements/rubrics/ajax_rubric_view.ctp index 43dc34354..4f4632c45 100644 --- a/app/views/elements/rubrics/ajax_rubric_view.ctp +++ b/app/views/elements/rubrics/ajax_rubric_view.ctp @@ -48,8 +48,10 @@ $reqCom = isset($event) && $event['Event']['com_req'] ? '
( onClick="document.evalForm.selected_lom_.value=;" /> - -
:
+ + +
:
+ From 7900750f628310b77decb4f21f77b0ab8d0ec455 Mon Sep 17 00:00:00 2001 From: Kolja Schwenghagen Date: Tue, 19 Nov 2013 15:23:31 -0800 Subject: [PATCH 11/91] implemted Ticket #361 --- app/config/sql/delta_7.sql | 499 +++++++++++ app/config/sql/ipeer.sql | 890 ++++++++++---------- app/config/sql/ipeer_samples_data.sql | 890 ++++++++++---------- app/controllers/components/evaluation.php | 8 +- app/controllers/evaluations_controller.php | 96 ++- app/controllers/users_controller.php | 176 +++- app/models/event.php | 59 +- app/vendors/shells/create_acl.php | 1 + app/views/evaluations/mixeval_eval_form.ctp | 2 +- app/views/evaluations/rubric_eval_form.ctp | 3 +- app/views/evaluations/survey_eval_form.ctp | 10 +- app/views/users/go_to_class_list.ctp | 11 +- app/views/users/student_events.ctp | 207 +++++ 13 files changed, 1899 insertions(+), 953 deletions(-) create mode 100644 app/config/sql/delta_7.sql create mode 100644 app/views/users/student_events.ctp diff --git a/app/config/sql/delta_7.sql b/app/config/sql/delta_7.sql new file mode 100644 index 000000000..2ea5bf01d --- /dev/null +++ b/app/config/sql/delta_7.sql @@ -0,0 +1,499 @@ +DROP TABLE IF EXISTS `acos`; +CREATE TABLE IF NOT EXISTS `acos` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `parent_id` int(10) DEFAULT NULL, + `model` varchar(255) DEFAULT NULL, + `foreign_key` int(10) DEFAULT NULL, + `alias` varchar(255) DEFAULT NULL, + `lft` int(10) DEFAULT NULL, + `rght` int(10) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `parent_id` (`parent_id`), + KEY `alias` (`alias`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `acos` +-- + +INSERT INTO acos (id, parent_id, model, foreign_key, alias, lft, rght) VALUES +(1,NULL,NULL,NULL,'adminpage',1,2), +(2,NULL,NULL,NULL,'controllers',3,594), +(3,2,NULL,NULL,'Pages',4,17), +(4,3,NULL,NULL,'display',5,6), +(5,3,NULL,NULL,'add',7,8), +(6,3,NULL,NULL,'edit',9,10), +(7,3,NULL,NULL,'index',11,12), +(8,3,NULL,NULL,'view',13,14), +(9,3,NULL,NULL,'delete',15,16), +(10,2,NULL,NULL,'Searchs',18,45), +(11,10,NULL,NULL,'update',19,20), +(12,10,NULL,NULL,'index',21,22), +(13,10,NULL,NULL,'searchEvaluation',23,24), +(14,10,NULL,NULL,'searchResult',25,26), +(15,10,NULL,NULL,'searchInstructor',27,28), +(16,10,NULL,NULL,'eventBoxSearch',29,30), +(17,10,NULL,NULL,'formatSearchEvaluation',31,32), +(18,10,NULL,NULL,'formatSearchInstructor',33,34), +(19,10,NULL,NULL,'formatSearchEvaluationResult',35,36), +(20,10,NULL,NULL,'add',37,38), +(21,10,NULL,NULL,'edit',39,40), +(22,10,NULL,NULL,'view',41,42), +(23,10,NULL,NULL,'delete',43,44), +(24,2,NULL,NULL,'Users',46,81), +(25,24,NULL,NULL,'ajaxList',47,48), +(26,24,NULL,NULL,'index',49,50), +(27,24,NULL,NULL,'goToClassList',51,52), +(28,24,NULL,NULL,'determineIfStudentFromThisData',53,54), +(29,24,NULL,NULL,'view',55,56), +(30,24,NULL,NULL,'add',57,58), +(31,24,NULL,NULL,'enrol',59,60), +(32,24,NULL,NULL,'edit',61,62), +(33,24,NULL,NULL,'editProfile',63,64), +(34,24,NULL,NULL,'delete',65,66), +(35,24,NULL,NULL,'checkDuplicateName',67,68), +(36,24,NULL,NULL,'resetPassword',69,70), +(37,24,NULL,NULL,'import',71,72), +(38,24,NULL,NULL,'merge',73,74), +(39,24,NULL,NULL,'ajax_merge',75,76), +(40,24,NULL,NULL,'update',77,78), +(41,24,NULL,NULL,'showEvents',79,80), +(42,2,NULL,NULL,'Oauthclients',82,93), +(43,42,NULL,NULL,'index',83,84), +(44,42,NULL,NULL,'add',85,86), +(45,42,NULL,NULL,'edit',87,88), +(46,42,NULL,NULL,'delete',89,90), +(47,42,NULL,NULL,'view',91,92), +(48,2,NULL,NULL,'Framework',94,109), +(49,48,NULL,NULL,'calendarDisplay',95,96), +(50,48,NULL,NULL,'tutIndex',97,98), +(51,48,NULL,NULL,'add',99,100), +(52,48,NULL,NULL,'edit',101,102), +(53,48,NULL,NULL,'index',103,104), +(54,48,NULL,NULL,'view',105,106), +(55,48,NULL,NULL,'delete',107,108), +(56,2,NULL,NULL,'Home',110,121), +(57,56,NULL,NULL,'index',111,112), +(58,56,NULL,NULL,'add',113,114), +(59,56,NULL,NULL,'edit',115,116), +(60,56,NULL,NULL,'view',117,118), +(61,56,NULL,NULL,'delete',119,120), +(62,2,NULL,NULL,'Accesses',122,133), +(63,62,NULL,NULL,'view',123,124), +(64,62,NULL,NULL,'edit',125,126), +(65,62,NULL,NULL,'add',127,128), +(66,62,NULL,NULL,'index',129,130), +(67,62,NULL,NULL,'delete',131,132), +(68,2,NULL,NULL,'Surveygroups',134,165), +(69,68,NULL,NULL,'postProcess',135,136), +(70,68,NULL,NULL,'setUpAjaxList',137,138), +(71,68,NULL,NULL,'index',139,140), +(72,68,NULL,NULL,'ajaxList',141,142), +(73,68,NULL,NULL,'makegroups',143,144), +(74,68,NULL,NULL,'makegroupssearch',145,146), +(75,68,NULL,NULL,'maketmgroups',147,148), +(76,68,NULL,NULL,'savegroups',149,150), +(77,68,NULL,NULL,'release',151,152), +(78,68,NULL,NULL,'delete',153,154), +(79,68,NULL,NULL,'edit',155,156), +(80,68,NULL,NULL,'changegroupset',157,158), +(81,68,NULL,NULL,'export',159,160), +(82,68,NULL,NULL,'add',161,162), +(83,68,NULL,NULL,'view',163,164), +(84,2,NULL,NULL,'Upgrade',166,179), +(85,84,NULL,NULL,'index',167,168), +(86,84,NULL,NULL,'step2',169,170), +(87,84,NULL,NULL,'add',171,172), +(88,84,NULL,NULL,'edit',173,174), +(89,84,NULL,NULL,'view',175,176), +(90,84,NULL,NULL,'delete',177,178), +(91,2,NULL,NULL,'Evaluations',180,219), +(92,91,NULL,NULL,'setUpAjaxList',181,182), +(93,91,NULL,NULL,'ajaxList',183,184), +(94,91,NULL,NULL,'view',185,186), +(95,91,NULL,NULL,'index',187,188), +(96,91,NULL,NULL,'export',189,190), +(97,91,NULL,NULL,'makeEvaluation',191,192), +(98,91,NULL,NULL,'completeEvaluationRubric',193,194), +(99,91,NULL,NULL,'viewEvaluationResults',195,196), +(100,91,NULL,NULL,'studentViewEvaluationResult',197,198), +(101,91,NULL,NULL,'markEventReviewed',199,200), +(102,91,NULL,NULL,'markGradeRelease',201,202), +(103,91,NULL,NULL,'markCommentRelease',203,204), +(104,91,NULL,NULL,'changeAllCommentRelease',205,206), +(105,91,NULL,NULL,'changeAllGradeRelease',207,208), +(106,91,NULL,NULL,'viewGroupSubmissionDetails',209,210), +(107,91,NULL,NULL,'viewSurveySummary',211,212), +(108,91,NULL,NULL,'add',213,214), +(109,91,NULL,NULL,'edit',215,216), +(110,91,NULL,NULL,'delete',217,218), +(111,2,NULL,NULL,'Oauthtokens',220,231), +(112,111,NULL,NULL,'index',221,222), +(113,111,NULL,NULL,'add',223,224), +(114,111,NULL,NULL,'edit',225,226), +(115,111,NULL,NULL,'delete',227,228), +(116,111,NULL,NULL,'view',229,230), +(117,2,NULL,NULL,'Evaltools',232,243), +(118,117,NULL,NULL,'index',233,234), +(119,117,NULL,NULL,'add',235,236), +(120,117,NULL,NULL,'edit',237,238), +(121,117,NULL,NULL,'view',239,240), +(122,117,NULL,NULL,'delete',241,242), +(123,2,NULL,NULL,'Penalty',244,257), +(124,123,NULL,NULL,'save',245,246), +(125,123,NULL,NULL,'add',247,248), +(126,123,NULL,NULL,'edit',249,250), +(127,123,NULL,NULL,'index',251,252), +(128,123,NULL,NULL,'view',253,254), +(129,123,NULL,NULL,'delete',255,256), +(130,2,NULL,NULL,'Groups',258,277), +(131,130,NULL,NULL,'setUpAjaxList',259,260), +(132,130,NULL,NULL,'index',261,262), +(133,130,NULL,NULL,'ajaxList',263,264), +(134,130,NULL,NULL,'view',265,266), +(135,130,NULL,NULL,'add',267,268), +(136,130,NULL,NULL,'edit',269,270), +(137,130,NULL,NULL,'delete',271,272), +(138,130,NULL,NULL,'import',273,274), +(139,130,NULL,NULL,'export',275,276), +(140,2,NULL,NULL,'Faculties',278,289), +(141,140,NULL,NULL,'index',279,280), +(142,140,NULL,NULL,'view',281,282), +(143,140,NULL,NULL,'add',283,284), +(144,140,NULL,NULL,'edit',285,286), +(145,140,NULL,NULL,'delete',287,288), +(146,2,NULL,NULL,'Rubrics',290,309), +(147,146,NULL,NULL,'postProcess',291,292), +(148,146,NULL,NULL,'setUpAjaxList',293,294), +(149,146,NULL,NULL,'index',295,296), +(150,146,NULL,NULL,'ajaxList',297,298), +(151,146,NULL,NULL,'view',299,300), +(152,146,NULL,NULL,'add',301,302), +(153,146,NULL,NULL,'edit',303,304), +(154,146,NULL,NULL,'copy',305,306), +(155,146,NULL,NULL,'delete',307,308), +(156,2,NULL,NULL,'Events',310,337), +(157,156,NULL,NULL,'postProcessData',311,312), +(158,156,NULL,NULL,'setUpAjaxList',313,314), +(159,156,NULL,NULL,'index',315,316), +(160,156,NULL,NULL,'ajaxList',317,318), +(161,156,NULL,NULL,'view',319,320), +(162,156,NULL,NULL,'add',321,322), +(163,156,NULL,NULL,'setSchedule',323,324), +(164,156,NULL,NULL,'getGroupMembers',325,326), +(165,156,NULL,NULL,'edit',327,328), +(166,156,NULL,NULL,'checkIfChanged',329,330), +(167,156,NULL,NULL,'calculateFrequency',331,332), +(168,156,NULL,NULL,'delete',333,334), +(169,156,NULL,NULL,'checkDuplicateName',335,336), +(170,2,NULL,NULL,'Simpleevaluations',338,357), +(171,170,NULL,NULL,'postProcess',339,340), +(172,170,NULL,NULL,'setUpAjaxList',341,342), +(173,170,NULL,NULL,'index',343,344), +(174,170,NULL,NULL,'ajaxList',345,346), +(175,170,NULL,NULL,'view',347,348), +(176,170,NULL,NULL,'add',349,350), +(177,170,NULL,NULL,'edit',351,352), +(178,170,NULL,NULL,'copy',353,354), +(179,170,NULL,NULL,'delete',355,356), +(180,2,NULL,NULL,'V1',358,393), +(181,180,NULL,NULL,'oauth',359,360), +(182,180,NULL,NULL,'oauth_error',361,362), +(183,180,NULL,NULL,'users',363,364), +(184,180,NULL,NULL,'courses',365,366), +(185,180,NULL,NULL,'groups',367,368), +(186,180,NULL,NULL,'groupMembers',369,370), +(187,180,NULL,NULL,'events',371,372), +(188,180,NULL,NULL,'grades',373,374), +(189,180,NULL,NULL,'departments',375,376), +(190,180,NULL,NULL,'courseDepartments',377,378), +(191,180,NULL,NULL,'userEvents',379,380), +(192,180,NULL,NULL,'enrolment',381,382), +(193,180,NULL,NULL,'add',383,384), +(194,180,NULL,NULL,'edit',385,386), +(195,180,NULL,NULL,'index',387,388), +(196,180,NULL,NULL,'view',389,390), +(197,180,NULL,NULL,'delete',391,392), +(198,2,NULL,NULL,'Departments',394,405), +(199,198,NULL,NULL,'index',395,396), +(200,198,NULL,NULL,'view',397,398), +(201,198,NULL,NULL,'add',399,400), +(202,198,NULL,NULL,'edit',401,402), +(203,198,NULL,NULL,'delete',403,404), +(204,2,NULL,NULL,'Sysparameters',406,421), +(205,204,NULL,NULL,'setUpAjaxList',407,408), +(206,204,NULL,NULL,'index',409,410), +(207,204,NULL,NULL,'ajaxList',411,412), +(208,204,NULL,NULL,'view',413,414), +(209,204,NULL,NULL,'add',415,416), +(210,204,NULL,NULL,'edit',417,418), +(211,204,NULL,NULL,'delete',419,420), +(212,2,NULL,NULL,'Mixevals',422,439), +(213,212,NULL,NULL,'setUpAjaxList',423,424), +(214,212,NULL,NULL,'index',425,426), +(215,212,NULL,NULL,'ajaxList',427,428), +(216,212,NULL,NULL,'view',429,430), +(217,212,NULL,NULL,'add',431,432), +(218,212,NULL,NULL,'edit',433,434), +(219,212,NULL,NULL,'copy',435,436), +(220,212,NULL,NULL,'delete',437,438), +(221,2,NULL,NULL,'Emailtemplates',440,459), +(222,221,NULL,NULL,'setUpAjaxList',441,442), +(223,221,NULL,NULL,'ajaxList',443,444), +(224,221,NULL,NULL,'index',445,446), +(225,221,NULL,NULL,'add',447,448), +(226,221,NULL,NULL,'edit',449,450), +(227,221,NULL,NULL,'delete',451,452), +(228,221,NULL,NULL,'view',453,454), +(229,221,NULL,NULL,'displayTemplateContent',455,456), +(230,221,NULL,NULL,'displayTemplateSubject',457,458), +(231,2,NULL,NULL,'Install',460,481), +(232,231,NULL,NULL,'index',461,462), +(233,231,NULL,NULL,'install2',463,464), +(234,231,NULL,NULL,'install3',465,466), +(235,231,NULL,NULL,'install4',467,468), +(236,231,NULL,NULL,'install5',469,470), +(237,231,NULL,NULL,'gpl',471,472), +(238,231,NULL,NULL,'add',473,474), +(239,231,NULL,NULL,'edit',475,476), +(240,231,NULL,NULL,'view',477,478), +(241,231,NULL,NULL,'delete',479,480), +(242,2,NULL,NULL,'Courses',482,505), +(243,242,NULL,NULL,'daysLate',483,484), +(244,242,NULL,NULL,'index',485,486), +(245,242,NULL,NULL,'ajaxList',487,488), +(246,242,NULL,NULL,'view',489,490), +(247,242,NULL,NULL,'home',491,492), +(248,242,NULL,NULL,'add',493,494), +(249,242,NULL,NULL,'edit',495,496), +(250,242,NULL,NULL,'delete',497,498), +(251,242,NULL,NULL,'move',499,500), +(252,242,NULL,NULL,'ajax_options',501,502), +(253,242,NULL,NULL,'import',503,504), +(254,2,NULL,NULL,'Surveys',506,535), +(255,254,NULL,NULL,'setUpAjaxList',507,508), +(256,254,NULL,NULL,'index',509,510), +(257,254,NULL,NULL,'ajaxList',511,512), +(258,254,NULL,NULL,'view',513,514), +(259,254,NULL,NULL,'add',515,516), +(260,254,NULL,NULL,'edit',517,518), +(261,254,NULL,NULL,'copy',519,520), +(262,254,NULL,NULL,'delete',521,522), +(263,254,NULL,NULL,'questionsSummary',523,524), +(264,254,NULL,NULL,'moveQuestion',525,526), +(265,254,NULL,NULL,'removeQuestion',527,528), +(266,254,NULL,NULL,'addQuestion',529,530), +(267,254,NULL,NULL,'editQuestion',531,532), +(268,254,NULL,NULL,'surveyAccess',533,534), +(269,2,NULL,NULL,'Lti',536,547), +(270,269,NULL,NULL,'index',537,538), +(271,269,NULL,NULL,'add',539,540), +(272,269,NULL,NULL,'edit',541,542), +(273,269,NULL,NULL,'view',543,544), +(274,269,NULL,NULL,'delete',545,546), +(275,2,NULL,NULL,'Emailer',548,575), +(276,275,NULL,NULL,'setUpAjaxList',549,550), +(277,275,NULL,NULL,'ajaxList',551,552), +(278,275,NULL,NULL,'index',553,554), +(279,275,NULL,NULL,'write',555,556), +(280,275,NULL,NULL,'cancel',557,558), +(281,275,NULL,NULL,'view',559,560), +(282,275,NULL,NULL,'addRecipient',561,562), +(283,275,NULL,NULL,'deleteRecipient',563,564), +(284,275,NULL,NULL,'getRecipient',565,566), +(285,275,NULL,NULL,'searchByUserId',567,568), +(286,275,NULL,NULL,'add',569,570), +(287,275,NULL,NULL,'edit',571,572), +(288,275,NULL,NULL,'delete',573,574), +(289,2,NULL,NULL,'Guard',576,593), +(290,289,NULL,NULL,'Guard',577,592), +(291,290,NULL,NULL,'login',578,579), +(292,290,NULL,NULL,'logout',580,581), +(293,290,NULL,NULL,'add',582,583), +(294,290,NULL,NULL,'edit',584,585), +(295,290,NULL,NULL,'index',586,587), +(296,290,NULL,NULL,'view',588,589), +(297,290,NULL,NULL,'delete',590,591), +(298,NULL,NULL,NULL,'functions',595,658), +(299,298,NULL,NULL,'user',596,623), +(300,299,NULL,NULL,'superadmin',597,598), +(301,299,NULL,NULL,'admin',599,600), +(302,299,NULL,NULL,'instructor',601,602), +(303,299,NULL,NULL,'tutor',603,604), +(304,299,NULL,NULL,'student',605,606), +(305,299,NULL,NULL,'import',607,608), +(306,299,NULL,NULL,'password_reset',609,620), +(307,306,NULL,NULL,'superadmin',610,611), +(308,306,NULL,NULL,'admin',612,613), +(309,306,NULL,NULL,'instructor',614,615), +(310,306,NULL,NULL,'tutor',616,617), +(311,306,NULL,NULL,'student',618,619), +(312,299,NULL,NULL,'index',621,622), +(313,298,NULL,NULL,'role',624,635), +(314,313,NULL,NULL,'superadmin',625,626), +(315,313,NULL,NULL,'admin',627,628), +(316,313,NULL,NULL,'instructor',629,630), +(317,313,NULL,NULL,'tutor',631,632), +(318,313,NULL,NULL,'student',633,634), +(319,298,NULL,NULL,'evaluation',636,637), +(320,298,NULL,NULL,'email',638,645), +(321,320,NULL,NULL,'allUsers',639,640), +(322,320,NULL,NULL,'allGroups',641,642), +(323,320,NULL,NULL,'allCourses',643,644), +(324,298,NULL,NULL,'emailtemplate',646,647), +(325,298,NULL,NULL,'viewstudentresults',648,649), +(326,298,NULL,NULL,'viewemailaddresses',650,651), +(327,298,NULL,NULL,'superadmin',652,653), +(328,298,NULL,NULL,'coursemanager',654,655), +(329,298,NULL,NULL,'viewusername',656,657); + +DROP TABLE IF EXISTS `aros`; +CREATE TABLE IF NOT EXISTS `aros` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `parent_id` int(10) DEFAULT NULL, + `model` varchar(255) DEFAULT NULL, + `foreign_key` int(10) DEFAULT NULL, + `alias` varchar(255) DEFAULT NULL, + `lft` int(10) DEFAULT NULL, + `rght` int(10) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `aros` (`id`, `parent_id`, `model`, `foreign_key`, `alias`, `lft`, `rght`) VALUES +(1, NULL, 'Role', 1, NULL, 1, 2), +(2, NULL, 'Role', 2, NULL, 3, 4), +(3, NULL, 'Role', 3, NULL, 5, 6), +(4, NULL, 'Role', 4, NULL, 7, 8), +(5, NULL, 'Role', 5, NULL, 9, 10); + +DROP TABLE IF EXISTS `aros_acos`; +CREATE TABLE IF NOT EXISTS `aros_acos` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `aro_id` int(10) NOT NULL, + `aco_id` int(10) NOT NULL, + `_create` varchar(2) NOT NULL DEFAULT '0', + `_read` varchar(2) NOT NULL DEFAULT '0', + `_update` varchar(2) NOT NULL DEFAULT '0', + `_delete` varchar(2) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `ARO_ACO_KEY` (`aro_id`,`aco_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO aros_acos (id, aro_id, aco_id, _create, _read, _update, _delete) VALUES +(1,1,2,'1','1','1','1'), +(2,1,298,'1','1','1','1'), +(3,1,1,'1','1','1','1'), +(4,2,2,'-1','-1','-1','-1'), +(5,2,56,'1','1','1','1'), +(6,2,242,'1','1','1','1'), +(7,2,198,'1','1','1','1'), +(8,2,201,'-1','-1','-1','-1'), +(9,2,200,'-1','-1','-1','-1'), +(10,2,203,'-1','-1','-1','-1'), +(11,2,202,'-1','-1','-1','-1'), +(12,2,199,'-1','-1','-1','-1'), +(13,2,275,'1','1','1','1'), +(14,2,221,'1','1','1','1'), +(15,2,117,'1','1','1','1'), +(16,2,91,'1','1','1','1'), +(17,2,156,'1','1','1','1'), +(18,2,130,'1','1','1','1'), +(19,2,212,'1','1','1','1'), +(20,2,146,'1','1','1','1'), +(21,2,170,'1','1','1','1'), +(22,2,254,'1','1','1','1'), +(23,2,68,'1','1','1','1'), +(24,2,24,'1','1','1','1'), +(25,2,292,'1','1','1','1'), +(26,2,298,'-1','-1','-1','-1'), +(27,2,324,'1','1','1','1'), +(28,2,319,'1','1','1','1'), +(29,2,321,'1','1','1','1'), +(30,2,299,'1','1','1','1'), +(31,2,301,'1','1','1','-1'), +(32,2,300,'-1','-1','-1','-1'), +(33,2,326,'1','1','1','1'), +(34,2,329,'1','1','1','1'), +(35,2,328,'1','1','1','1'), +(36,2,327,'-1','-1','-1','-1'), +(37,3,2,'-1','-1','-1','-1'), +(38,3,56,'1','1','1','1'), +(39,3,242,'1','1','1','1'), +(40,3,275,'1','1','1','1'), +(41,3,221,'1','1','1','1'), +(42,3,117,'1','1','1','1'), +(43,3,91,'1','1','1','1'), +(44,3,156,'1','1','1','1'), +(45,3,130,'1','1','1','1'), +(46,3,212,'1','1','1','1'), +(47,3,146,'1','1','1','1'), +(48,3,170,'1','1','1','1'), +(49,3,254,'1','1','1','1'), +(50,3,68,'1','1','1','1'), +(51,3,24,'1','1','1','1'), +(52,3,292,'1','1','1','1'), +(53,3,44,'1','1','1','1'), +(54,3,46,'1','1','1','1'), +(55,3,113,'1','1','1','1'), +(56,3,115,'1','1','1','1'), +(57,3,38,'-1','-1','-1','-1'), +(58,3,41,'1','1','1','1'), +(59,3,298,'-1','-1','-1','-1'), +(60,3,319,'1','1','-1','-1'), +(61,3,299,'1','1','1','1'), +(62,3,301,'-1','-1','-1','-1'), +(63,3,300,'-1','-1','-1','-1'), +(64,3,302,'-1','1','-1','-1'), +(65,3,312,'-1','-1','-1','-1'), +(66,3,326,'-1','-1','-1','-1'), +(67,3,327,'-1','-1','-1','-1'), +(68,3,328,'1','1','1','1'), +(69,4,2,'-1','-1','-1','-1'), +(70,4,56,'1','1','1','1'), +(71,4,242,'-1','-1','-1','-1'), +(72,4,275,'-1','-1','-1','-1'), +(73,4,221,'-1','-1','-1','-1'), +(74,4,117,'-1','-1','-1','-1'), +(75,4,156,'-1','-1','-1','-1'), +(76,4,130,'-1','-1','-1','-1'), +(77,4,212,'-1','-1','-1','-1'), +(78,4,146,'-1','-1','-1','-1'), +(79,4,170,'-1','-1','-1','-1'), +(80,4,254,'-1','-1','-1','-1'), +(81,4,68,'-1','-1','-1','-1'), +(82,4,24,'-1','-1','-1','-1'), +(83,4,292,'1','1','1','1'), +(84,4,97,'1','1','1','1'), +(85,4,100,'1','1','1','1'), +(86,4,98,'1','1','1','1'), +(87,4,33,'1','1','1','1'), +(88,4,298,'-1','-1','-1','-1'), +(89,4,326,'-1','-1','-1','-1'), +(90,4,327,'-1','-1','-1','-1'), +(91,5,2,'-1','-1','-1','-1'), +(92,5,56,'1','1','1','1'), +(93,5,242,'-1','-1','-1','-1'), +(94,5,275,'-1','-1','-1','-1'), +(95,5,221,'-1','-1','-1','-1'), +(96,5,117,'-1','-1','-1','-1'), +(97,5,156,'-1','-1','-1','-1'), +(98,5,130,'-1','-1','-1','-1'), +(99,5,212,'-1','-1','-1','-1'), +(100,5,146,'-1','-1','-1','-1'), +(101,5,170,'-1','-1','-1','-1'), +(102,5,254,'-1','-1','-1','-1'), +(103,5,68,'-1','-1','-1','-1'), +(104,5,24,'-1','-1','-1','-1'), +(105,5,292,'1','1','1','1'), +(106,5,97,'1','1','1','1'), +(107,5,100,'1','1','1','1'), +(108,5,98,'1','1','1','1'), +(109,5,33,'1','1','1','1'), +(110,5,44,'1','1','1','1'), +(111,5,46,'1','1','1','1'), +(112,5,113,'1','1','1','1'), +(113,5,115,'1','1','1','1'), +(114,5,298,'-1','-1','-1','-1'), +(115,5,325,'1','1','1','1'), +(116,5,326,'-1','-1','-1','-1'), +(117,5,327,'-1','-1','-1','-1'); \ No newline at end of file diff --git a/app/config/sql/ipeer.sql b/app/config/sql/ipeer.sql index 340e2d12a..6060d6018 100644 --- a/app/config/sql/ipeer.sql +++ b/app/config/sql/ipeer.sql @@ -36,334 +36,335 @@ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101 SET NAMES utf8 */; INSERT INTO acos (id, parent_id, model, foreign_key, alias, lft, rght) VALUES -(1, NULL, NULL, NULL, 'adminpage', 1, 2), -(2, NULL, NULL, NULL, 'controllers', 3, 592), -(3, 2, NULL, NULL, 'Pages', 4, 17), -(4, 3, NULL, NULL, 'display', 5, 6), -(5, 3, NULL, NULL, 'add', 7, 8), -(6, 3, NULL, NULL, 'edit', 9, 10), -(7, 3, NULL, NULL, 'index', 11, 12), -(8, 3, NULL, NULL, 'view', 13, 14), -(9, 3, NULL, NULL, 'delete', 15, 16), -(10, 2, NULL, NULL, 'Accesses', 18, 29), -(11, 10, NULL, NULL, 'view', 19, 20), -(12, 10, NULL, NULL, 'edit', 21, 22), -(13, 10, NULL, NULL, 'add', 23, 24), -(14, 10, NULL, NULL, 'index', 25, 26), -(15, 10, NULL, NULL, 'delete', 27, 28), -(16, 2, NULL, NULL, 'Courses', 30, 53), -(17, 16, NULL, NULL, 'daysLate', 31, 32), -(18, 16, NULL, NULL, 'index', 33, 34), -(19, 16, NULL, NULL, 'ajaxList', 35, 36), -(20, 16, NULL, NULL, 'view', 37, 38), -(21, 16, NULL, NULL, 'home', 39, 40), -(22, 16, NULL, NULL, 'add', 41, 42), -(23, 16, NULL, NULL, 'edit', 43, 44), -(24, 16, NULL, NULL, 'delete', 45, 46), -(25, 16, NULL, NULL, 'move', 47, 48), -(26, 16, NULL, NULL, 'ajax_options', 49, 50), -(27, 16, NULL, NULL, 'import', 51, 52), -(28, 2, NULL, NULL, 'Departments', 54, 65), -(29, 28, NULL, NULL, 'index', 55, 56), -(30, 28, NULL, NULL, 'view', 57, 58), -(31, 28, NULL, NULL, 'add', 59, 60), -(32, 28, NULL, NULL, 'edit', 61, 62), -(33, 28, NULL, NULL, 'delete', 63, 64), -(34, 2, NULL, NULL, 'Emailer', 66, 93), -(35, 34, NULL, NULL, 'setUpAjaxList', 67, 68), -(36, 34, NULL, NULL, 'ajaxList', 69, 70), -(37, 34, NULL, NULL, 'index', 71, 72), -(38, 34, NULL, NULL, 'write', 73, 74), -(39, 34, NULL, NULL, 'cancel', 75, 76), -(40, 34, NULL, NULL, 'view', 77, 78), -(41, 34, NULL, NULL, 'addRecipient', 79, 80), -(42, 34, NULL, NULL, 'deleteRecipient', 81, 82), -(43, 34, NULL, NULL, 'getRecipient', 83, 84), -(44, 34, NULL, NULL, 'searchByUserId', 85, 86), -(45, 34, NULL, NULL, 'add', 87, 88), -(46, 34, NULL, NULL, 'edit', 89, 90), -(47, 34, NULL, NULL, 'delete', 91, 92), -(48, 2, NULL, NULL, 'Emailtemplates', 94, 113), -(49, 48, NULL, NULL, 'setUpAjaxList', 95, 96), -(50, 48, NULL, NULL, 'ajaxList', 97, 98), -(51, 48, NULL, NULL, 'index', 99, 100), -(52, 48, NULL, NULL, 'add', 101, 102), -(53, 48, NULL, NULL, 'edit', 103, 104), -(54, 48, NULL, NULL, 'delete', 105, 106), -(55, 48, NULL, NULL, 'view', 107, 108), -(56, 48, NULL, NULL, 'displayTemplateContent', 109, 110), -(57, 48, NULL, NULL, 'displayTemplateSubject', 111, 112), -(58, 2, NULL, NULL, 'Evaltools', 114, 125), -(59, 58, NULL, NULL, 'index', 115, 116), -(60, 58, NULL, NULL, 'add', 117, 118), -(61, 58, NULL, NULL, 'edit', 119, 120), -(62, 58, NULL, NULL, 'view', 121, 122), -(63, 58, NULL, NULL, 'delete', 123, 124), -(64, 2, NULL, NULL, 'Evaluations', 126, 165), -(65, 64, NULL, NULL, 'setUpAjaxList', 127, 128), -(66, 64, NULL, NULL, 'ajaxList', 129, 130), -(67, 64, NULL, NULL, 'view', 131, 132), -(68, 64, NULL, NULL, 'index', 133, 134), -(69, 64, NULL, NULL, 'export', 135, 136), -(70, 64, NULL, NULL, 'makeEvaluation', 137, 138), -(71, 64, NULL, NULL, 'completeEvaluationRubric', 139, 140), -(72, 64, NULL, NULL, 'viewEvaluationResults', 141, 142), -(73, 64, NULL, NULL, 'studentViewEvaluationResult', 143, 144), -(74, 64, NULL, NULL, 'markEventReviewed', 145, 146), -(75, 64, NULL, NULL, 'markGradeRelease', 147, 148), -(76, 64, NULL, NULL, 'markCommentRelease', 149, 150), -(77, 64, NULL, NULL, 'changeAllCommentRelease', 151, 152), -(78, 64, NULL, NULL, 'changeAllGradeRelease', 153, 154), -(79, 64, NULL, NULL, 'viewGroupSubmissionDetails', 155, 156), -(80, 64, NULL, NULL, 'viewSurveySummary', 157, 158), -(81, 64, NULL, NULL, 'add', 159, 160), -(82, 64, NULL, NULL, 'edit', 161, 162), -(83, 64, NULL, NULL, 'delete', 163, 164), -(84, 2, NULL, NULL, 'Events', 166, 193), -(85, 84, NULL, NULL, 'postProcessData', 167, 168), -(86, 84, NULL, NULL, 'setUpAjaxList', 169, 170), -(87, 84, NULL, NULL, 'index', 171, 172), -(88, 84, NULL, NULL, 'ajaxList', 173, 174), -(89, 84, NULL, NULL, 'view', 175, 176), -(90, 84, NULL, NULL, 'add', 177, 178), -(91, 84, NULL, NULL, 'setSchedule', 179, 180), -(92, 84, NULL, NULL, 'getGroupMembers', 181, 182), -(93, 84, NULL, NULL, 'edit', 183, 184), -(94, 84, NULL, NULL, 'checkIfChanged', 185, 186), -(95, 84, NULL, NULL, 'calculateFrequency', 187, 188), -(96, 84, NULL, NULL, 'delete', 189, 190), -(97, 84, NULL, NULL, 'checkDuplicateName', 191, 192), -(98, 2, NULL, NULL, 'Faculties', 194, 205), -(99, 98, NULL, NULL, 'index', 195, 196), -(100, 98, NULL, NULL, 'view', 197, 198), -(101, 98, NULL, NULL, 'add', 199, 200), -(102, 98, NULL, NULL, 'edit', 201, 202), -(103, 98, NULL, NULL, 'delete', 203, 204), -(104, 2, NULL, NULL, 'Framework', 206, 221), -(105, 104, NULL, NULL, 'calendarDisplay', 207, 208), -(106, 104, NULL, NULL, 'tutIndex', 209, 210), -(107, 104, NULL, NULL, 'add', 211, 212), -(108, 104, NULL, NULL, 'edit', 213, 214), -(109, 104, NULL, NULL, 'index', 215, 216), -(110, 104, NULL, NULL, 'view', 217, 218), -(111, 104, NULL, NULL, 'delete', 219, 220), -(112, 2, NULL, NULL, 'Groups', 222, 241), -(113, 112, NULL, NULL, 'setUpAjaxList', 223, 224), -(114, 112, NULL, NULL, 'index', 225, 226), -(115, 112, NULL, NULL, 'ajaxList', 227, 228), -(116, 112, NULL, NULL, 'view', 229, 230), -(117, 112, NULL, NULL, 'add', 231, 232), -(118, 112, NULL, NULL, 'edit', 233, 234), -(119, 112, NULL, NULL, 'delete', 235, 236), -(120, 112, NULL, NULL, 'import', 237, 238), -(121, 112, NULL, NULL, 'export', 239, 240), -(122, 2, NULL, NULL, 'Home', 242, 253), -(123, 122, NULL, NULL, 'index', 243, 244), -(124, 122, NULL, NULL, 'add', 245, 246), -(125, 122, NULL, NULL, 'edit', 247, 248), -(126, 122, NULL, NULL, 'view', 249, 250), -(127, 122, NULL, NULL, 'delete', 251, 252), -(128, 2, NULL, NULL, 'Install', 254, 275), -(129, 128, NULL, NULL, 'index', 255, 256), -(130, 128, NULL, NULL, 'install2', 257, 258), -(131, 128, NULL, NULL, 'install3', 259, 260), -(132, 128, NULL, NULL, 'install4', 261, 262), -(133, 128, NULL, NULL, 'install5', 263, 264), -(134, 128, NULL, NULL, 'gpl', 265, 266), -(135, 128, NULL, NULL, 'add', 267, 268), -(136, 128, NULL, NULL, 'edit', 269, 270), -(137, 128, NULL, NULL, 'view', 271, 272), -(138, 128, NULL, NULL, 'delete', 273, 274), -(139, 2, NULL, NULL, 'Lti', 276, 287), -(140, 139, NULL, NULL, 'index', 277, 278), -(141, 139, NULL, NULL, 'add', 279, 280), -(142, 139, NULL, NULL, 'edit', 281, 282), -(143, 139, NULL, NULL, 'view', 283, 284), -(144, 139, NULL, NULL, 'delete', 285, 286), -(145, 2, NULL, NULL, 'Mixevals', 288, 305), -(146, 145, NULL, NULL, 'setUpAjaxList', 289, 290), -(147, 145, NULL, NULL, 'index', 291, 292), -(148, 145, NULL, NULL, 'ajaxList', 293, 294), -(149, 145, NULL, NULL, 'view', 295, 296), -(150, 145, NULL, NULL, 'add', 297, 298), -(151, 145, NULL, NULL, 'edit', 299, 300), -(152, 145, NULL, NULL, 'copy', 301, 302), -(153, 145, NULL, NULL, 'delete', 303, 304), -(154, 2, NULL, NULL, 'Oauthclients', 306, 317), -(155, 154, NULL, NULL, 'index', 307, 308), -(156, 154, NULL, NULL, 'add', 309, 310), -(157, 154, NULL, NULL, 'edit', 311, 312), -(158, 154, NULL, NULL, 'delete', 313, 314), -(159, 154, NULL, NULL, 'view', 315, 316), -(160, 2, NULL, NULL, 'Oauthtokens', 318, 329), -(161, 160, NULL, NULL, 'index', 319, 320), -(162, 160, NULL, NULL, 'add', 321, 322), -(163, 160, NULL, NULL, 'edit', 323, 324), -(164, 160, NULL, NULL, 'delete', 325, 326), -(165, 160, NULL, NULL, 'view', 327, 328), -(166, 2, NULL, NULL, 'Penalty', 330, 343), -(167, 166, NULL, NULL, 'save', 331, 332), -(168, 166, NULL, NULL, 'add', 333, 334), -(169, 166, NULL, NULL, 'edit', 335, 336), -(170, 166, NULL, NULL, 'index', 337, 338), -(171, 166, NULL, NULL, 'view', 339, 340), -(172, 166, NULL, NULL, 'delete', 341, 342), -(173, 2, NULL, NULL, 'Rubrics', 344, 363), -(174, 173, NULL, NULL, 'postProcess', 345, 346), -(175, 173, NULL, NULL, 'setUpAjaxList', 347, 348), -(176, 173, NULL, NULL, 'index', 349, 350), -(177, 173, NULL, NULL, 'ajaxList', 351, 352), -(178, 173, NULL, NULL, 'view', 353, 354), -(179, 173, NULL, NULL, 'add', 355, 356), -(180, 173, NULL, NULL, 'edit', 357, 358), -(181, 173, NULL, NULL, 'copy', 359, 360), -(182, 173, NULL, NULL, 'delete', 361, 362), -(183, 2, NULL, NULL, 'Searchs', 364, 391), -(184, 183, NULL, NULL, 'update', 365, 366), -(185, 183, NULL, NULL, 'index', 367, 368), -(186, 183, NULL, NULL, 'searchEvaluation', 369, 370), -(187, 183, NULL, NULL, 'searchResult', 371, 372), -(188, 183, NULL, NULL, 'searchInstructor', 373, 374), -(189, 183, NULL, NULL, 'eventBoxSearch', 375, 376), -(190, 183, NULL, NULL, 'formatSearchEvaluation', 377, 378), -(191, 183, NULL, NULL, 'formatSearchInstructor', 379, 380), -(192, 183, NULL, NULL, 'formatSearchEvaluationResult', 381, 382), -(193, 183, NULL, NULL, 'add', 383, 384), -(194, 183, NULL, NULL, 'edit', 385, 386), -(195, 183, NULL, NULL, 'view', 387, 388), -(196, 183, NULL, NULL, 'delete', 389, 390), -(197, 2, NULL, NULL, 'Simpleevaluations', 392, 411), -(198, 197, NULL, NULL, 'postProcess', 393, 394), -(199, 197, NULL, NULL, 'setUpAjaxList', 395, 396), -(200, 197, NULL, NULL, 'index', 397, 398), -(201, 197, NULL, NULL, 'ajaxList', 399, 400), -(202, 197, NULL, NULL, 'view', 401, 402), -(203, 197, NULL, NULL, 'add', 403, 404), -(204, 197, NULL, NULL, 'edit', 405, 406), -(205, 197, NULL, NULL, 'copy', 407, 408), -(206, 197, NULL, NULL, 'delete', 409, 410), -(207, 2, NULL, NULL, 'Surveygroups', 412, 443), -(208, 207, NULL, NULL, 'postProcess', 413, 414), -(209, 207, NULL, NULL, 'setUpAjaxList', 415, 416), -(210, 207, NULL, NULL, 'index', 417, 418), -(211, 207, NULL, NULL, 'ajaxList', 419, 420), -(212, 207, NULL, NULL, 'makegroups', 421, 422), -(213, 207, NULL, NULL, 'makegroupssearch', 423, 424), -(214, 207, NULL, NULL, 'maketmgroups', 425, 426), -(215, 207, NULL, NULL, 'savegroups', 427, 428), -(216, 207, NULL, NULL, 'export', 429, 430), -(217, 207, NULL, NULL, 'release', 431, 432), -(218, 207, NULL, NULL, 'delete', 433, 434), -(219, 207, NULL, NULL, 'edit', 435, 436), -(220, 207, NULL, NULL, 'changegroupset', 437, 438), -(221, 207, NULL, NULL, 'add', 439, 440), -(222, 207, NULL, NULL, 'view', 441, 442), -(223, 2, NULL, NULL, 'Surveys', 444, 473), -(224, 223, NULL, NULL, 'setUpAjaxList', 445, 446), -(225, 223, NULL, NULL, 'index', 447, 448), -(226, 223, NULL, NULL, 'ajaxList', 449, 450), -(227, 223, NULL, NULL, 'view', 451, 452), -(228, 223, NULL, NULL, 'add', 453, 454), -(229, 223, NULL, NULL, 'edit', 455, 456), -(230, 223, NULL, NULL, 'copy', 457, 458), -(231, 223, NULL, NULL, 'delete', 459, 460), -(232, 223, NULL, NULL, 'questionsSummary', 461, 462), -(233, 223, NULL, NULL, 'moveQuestion', 463, 464), -(234, 223, NULL, NULL, 'removeQuestion', 465, 466), -(235, 223, NULL, NULL, 'addQuestion', 467, 468), -(236, 223, NULL, NULL, 'editQuestion', 469, 470), -(237, 223, NULL, NULL, 'surveyAccess', 471, 472), -(238, 2, NULL, NULL, 'Sysparameters', 474, 489), -(239, 238, NULL, NULL, 'setUpAjaxList', 475, 476), -(240, 238, NULL, NULL, 'index', 477, 478), -(241, 238, NULL, NULL, 'ajaxList', 479, 480), -(242, 238, NULL, NULL, 'view', 481, 482), -(243, 238, NULL, NULL, 'add', 483, 484), -(244, 238, NULL, NULL, 'edit', 485, 486), -(245, 238, NULL, NULL, 'delete', 487, 488), -(246, 2, NULL, NULL, 'Upgrade', 490, 503), -(247, 246, NULL, NULL, 'index', 491, 492), -(248, 246, NULL, NULL, 'step2', 493, 494), -(249, 246, NULL, NULL, 'add', 495, 496), -(250, 246, NULL, NULL, 'edit', 497, 498), -(251, 246, NULL, NULL, 'view', 499, 500), -(252, 246, NULL, NULL, 'delete', 501, 502), -(253, 2, NULL, NULL, 'Users', 504, 537), -(254, 253, NULL, NULL, 'ajaxList', 505, 506), -(255, 253, NULL, NULL, 'index', 507, 508), -(256, 253, NULL, NULL, 'goToClassList', 509, 510), -(257, 253, NULL, NULL, 'determineIfStudentFromThisData', 511, 512), -(258, 253, NULL, NULL, 'view', 513, 514), -(259, 253, NULL, NULL, 'add', 515, 516), -(260, 253, NULL, NULL, 'enrol', 517, 518), -(261, 253, NULL, NULL, 'edit', 519, 520), -(262, 253, NULL, NULL, 'editProfile', 521, 522), -(263, 253, NULL, NULL, 'delete', 523, 524), -(264, 253, NULL, NULL, 'checkDuplicateName', 525, 526), -(265, 253, NULL, NULL, 'resetPassword', 527, 528), -(266, 253, NULL, NULL, 'import', 529, 530), -(267, 253, NULL, NULL, 'merge', 531, 532), -(268, 253, NULL, NULL, 'ajax_merge', 533, 534), -(269, 253, NULL, NULL, 'update', 535, 536), -(270, 2, NULL, NULL, 'V1', 538, 573), -(271, 270, NULL, NULL, 'oauth', 539, 540), -(272, 270, NULL, NULL, 'oauth_error', 541, 542), -(273, 270, NULL, NULL, 'users', 543, 544), -(274, 270, NULL, NULL, 'courses', 545, 546), -(275, 270, NULL, NULL, 'groups', 547, 548), -(276, 270, NULL, NULL, 'groupMembers', 549, 550), -(277, 270, NULL, NULL, 'events', 551, 552), -(278, 270, NULL, NULL, 'grades', 553, 554), -(279, 270, NULL, NULL, 'departments', 555, 556), -(280, 270, NULL, NULL, 'courseDepartments', 557, 558), -(281, 270, NULL, NULL, 'userEvents', 559, 560), -(282, 270, NULL, NULL, 'enrolment', 561, 562), -(283, 270, NULL, NULL, 'add', 563, 564), -(284, 270, NULL, NULL, 'edit', 565, 566), -(285, 270, NULL, NULL, 'index', 567, 568), -(286, 270, NULL, NULL, 'view', 569, 570), -(287, 270, NULL, NULL, 'delete', 571, 572), -(288, 2, NULL, NULL, 'Guard', 574, 591), -(289, 288, NULL, NULL, 'Guard', 575, 590), -(290, 289, NULL, NULL, 'login', 576, 577), -(291, 289, NULL, NULL, 'logout', 578, 579), -(292, 289, NULL, NULL, 'add', 580, 581), -(293, 289, NULL, NULL, 'edit', 582, 583), -(294, 289, NULL, NULL, 'index', 584, 585), -(295, 289, NULL, NULL, 'view', 586, 587), -(296, 289, NULL, NULL, 'delete', 588, 589), -(297, NULL, NULL, NULL, 'functions', 593, 656), -(298, 297, NULL, NULL, 'user', 594, 621), -(299, 298, NULL, NULL, 'superadmin', 595, 596), -(300, 298, NULL, NULL, 'admin', 597, 598), -(301, 298, NULL, NULL, 'instructor', 599, 600), -(302, 298, NULL, NULL, 'tutor', 601, 602), -(303, 298, NULL, NULL, 'student', 603, 604), -(304, 298, NULL, NULL, 'import', 605, 606), -(305, 298, NULL, NULL, 'password_reset', 607, 618), -(306, 305, NULL, NULL, 'superadmin', 608, 609), -(307, 305, NULL, NULL, 'admin', 610, 611), -(308, 305, NULL, NULL, 'instructor', 612, 613), -(309, 305, NULL, NULL, 'tutor', 614, 615), -(310, 305, NULL, NULL, 'student', 616, 617), -(311, 298, NULL, NULL, 'index', 619, 620), -(312, 297, NULL, NULL, 'role', 622, 633), -(313, 312, NULL, NULL, 'superadmin', 623, 624), -(314, 312, NULL, NULL, 'admin', 625, 626), -(315, 312, NULL, NULL, 'instructor', 627, 628), -(316, 312, NULL, NULL, 'tutor', 629, 630), -(317, 312, NULL, NULL, 'student', 631, 632), -(318, 297, NULL, NULL, 'evaluation', 634, 635), -(319, 297, NULL, NULL, 'email', 636, 643), -(320, 319, NULL, NULL, 'allUsers', 637, 638), -(321, 319, NULL, NULL, 'allGroups', 639, 640), -(322, 319, NULL, NULL, 'allCourses', 641, 642), -(323, 297, NULL, NULL, 'emailtemplate', 644, 645), -(324, 297, NULL, NULL, 'viewstudentresults', 646, 647), -(325, 297, NULL, NULL, 'viewemailaddresses', 648, 649), -(326, 297, NULL, NULL, 'superadmin', 650, 651), -(327, 297, NULL, NULL, 'coursemanager', 652, 653), -(328, 297, NULL, NULL, 'viewusername', 654, 655); +(1,NULL,NULL,NULL,'adminpage',1,2), +(2,NULL,NULL,NULL,'controllers',3,594), +(3,2,NULL,NULL,'Pages',4,17), +(4,3,NULL,NULL,'display',5,6), +(5,3,NULL,NULL,'add',7,8), +(6,3,NULL,NULL,'edit',9,10), +(7,3,NULL,NULL,'index',11,12), +(8,3,NULL,NULL,'view',13,14), +(9,3,NULL,NULL,'delete',15,16), +(10,2,NULL,NULL,'Searchs',18,45), +(11,10,NULL,NULL,'update',19,20), +(12,10,NULL,NULL,'index',21,22), +(13,10,NULL,NULL,'searchEvaluation',23,24), +(14,10,NULL,NULL,'searchResult',25,26), +(15,10,NULL,NULL,'searchInstructor',27,28), +(16,10,NULL,NULL,'eventBoxSearch',29,30), +(17,10,NULL,NULL,'formatSearchEvaluation',31,32), +(18,10,NULL,NULL,'formatSearchInstructor',33,34), +(19,10,NULL,NULL,'formatSearchEvaluationResult',35,36), +(20,10,NULL,NULL,'add',37,38), +(21,10,NULL,NULL,'edit',39,40), +(22,10,NULL,NULL,'view',41,42), +(23,10,NULL,NULL,'delete',43,44), +(24,2,NULL,NULL,'Users',46,81), +(25,24,NULL,NULL,'ajaxList',47,48), +(26,24,NULL,NULL,'index',49,50), +(27,24,NULL,NULL,'goToClassList',51,52), +(28,24,NULL,NULL,'determineIfStudentFromThisData',53,54), +(29,24,NULL,NULL,'view',55,56), +(30,24,NULL,NULL,'add',57,58), +(31,24,NULL,NULL,'enrol',59,60), +(32,24,NULL,NULL,'edit',61,62), +(33,24,NULL,NULL,'editProfile',63,64), +(34,24,NULL,NULL,'delete',65,66), +(35,24,NULL,NULL,'checkDuplicateName',67,68), +(36,24,NULL,NULL,'resetPassword',69,70), +(37,24,NULL,NULL,'import',71,72), +(38,24,NULL,NULL,'merge',73,74), +(39,24,NULL,NULL,'ajax_merge',75,76), +(40,24,NULL,NULL,'update',77,78), +(41,24,NULL,NULL,'showEvents',79,80), +(42,2,NULL,NULL,'Oauthclients',82,93), +(43,42,NULL,NULL,'index',83,84), +(44,42,NULL,NULL,'add',85,86), +(45,42,NULL,NULL,'edit',87,88), +(46,42,NULL,NULL,'delete',89,90), +(47,42,NULL,NULL,'view',91,92), +(48,2,NULL,NULL,'Framework',94,109), +(49,48,NULL,NULL,'calendarDisplay',95,96), +(50,48,NULL,NULL,'tutIndex',97,98), +(51,48,NULL,NULL,'add',99,100), +(52,48,NULL,NULL,'edit',101,102), +(53,48,NULL,NULL,'index',103,104), +(54,48,NULL,NULL,'view',105,106), +(55,48,NULL,NULL,'delete',107,108), +(56,2,NULL,NULL,'Home',110,121), +(57,56,NULL,NULL,'index',111,112), +(58,56,NULL,NULL,'add',113,114), +(59,56,NULL,NULL,'edit',115,116), +(60,56,NULL,NULL,'view',117,118), +(61,56,NULL,NULL,'delete',119,120), +(62,2,NULL,NULL,'Accesses',122,133), +(63,62,NULL,NULL,'view',123,124), +(64,62,NULL,NULL,'edit',125,126), +(65,62,NULL,NULL,'add',127,128), +(66,62,NULL,NULL,'index',129,130), +(67,62,NULL,NULL,'delete',131,132), +(68,2,NULL,NULL,'Surveygroups',134,165), +(69,68,NULL,NULL,'postProcess',135,136), +(70,68,NULL,NULL,'setUpAjaxList',137,138), +(71,68,NULL,NULL,'index',139,140), +(72,68,NULL,NULL,'ajaxList',141,142), +(73,68,NULL,NULL,'makegroups',143,144), +(74,68,NULL,NULL,'makegroupssearch',145,146), +(75,68,NULL,NULL,'maketmgroups',147,148), +(76,68,NULL,NULL,'savegroups',149,150), +(77,68,NULL,NULL,'release',151,152), +(78,68,NULL,NULL,'delete',153,154), +(79,68,NULL,NULL,'edit',155,156), +(80,68,NULL,NULL,'changegroupset',157,158), +(81,68,NULL,NULL,'export',159,160), +(82,68,NULL,NULL,'add',161,162), +(83,68,NULL,NULL,'view',163,164), +(84,2,NULL,NULL,'Upgrade',166,179), +(85,84,NULL,NULL,'index',167,168), +(86,84,NULL,NULL,'step2',169,170), +(87,84,NULL,NULL,'add',171,172), +(88,84,NULL,NULL,'edit',173,174), +(89,84,NULL,NULL,'view',175,176), +(90,84,NULL,NULL,'delete',177,178), +(91,2,NULL,NULL,'Evaluations',180,219), +(92,91,NULL,NULL,'setUpAjaxList',181,182), +(93,91,NULL,NULL,'ajaxList',183,184), +(94,91,NULL,NULL,'view',185,186), +(95,91,NULL,NULL,'index',187,188), +(96,91,NULL,NULL,'export',189,190), +(97,91,NULL,NULL,'makeEvaluation',191,192), +(98,91,NULL,NULL,'completeEvaluationRubric',193,194), +(99,91,NULL,NULL,'viewEvaluationResults',195,196), +(100,91,NULL,NULL,'studentViewEvaluationResult',197,198), +(101,91,NULL,NULL,'markEventReviewed',199,200), +(102,91,NULL,NULL,'markGradeRelease',201,202), +(103,91,NULL,NULL,'markCommentRelease',203,204), +(104,91,NULL,NULL,'changeAllCommentRelease',205,206), +(105,91,NULL,NULL,'changeAllGradeRelease',207,208), +(106,91,NULL,NULL,'viewGroupSubmissionDetails',209,210), +(107,91,NULL,NULL,'viewSurveySummary',211,212), +(108,91,NULL,NULL,'add',213,214), +(109,91,NULL,NULL,'edit',215,216), +(110,91,NULL,NULL,'delete',217,218), +(111,2,NULL,NULL,'Oauthtokens',220,231), +(112,111,NULL,NULL,'index',221,222), +(113,111,NULL,NULL,'add',223,224), +(114,111,NULL,NULL,'edit',225,226), +(115,111,NULL,NULL,'delete',227,228), +(116,111,NULL,NULL,'view',229,230), +(117,2,NULL,NULL,'Evaltools',232,243), +(118,117,NULL,NULL,'index',233,234), +(119,117,NULL,NULL,'add',235,236), +(120,117,NULL,NULL,'edit',237,238), +(121,117,NULL,NULL,'view',239,240), +(122,117,NULL,NULL,'delete',241,242), +(123,2,NULL,NULL,'Penalty',244,257), +(124,123,NULL,NULL,'save',245,246), +(125,123,NULL,NULL,'add',247,248), +(126,123,NULL,NULL,'edit',249,250), +(127,123,NULL,NULL,'index',251,252), +(128,123,NULL,NULL,'view',253,254), +(129,123,NULL,NULL,'delete',255,256), +(130,2,NULL,NULL,'Groups',258,277), +(131,130,NULL,NULL,'setUpAjaxList',259,260), +(132,130,NULL,NULL,'index',261,262), +(133,130,NULL,NULL,'ajaxList',263,264), +(134,130,NULL,NULL,'view',265,266), +(135,130,NULL,NULL,'add',267,268), +(136,130,NULL,NULL,'edit',269,270), +(137,130,NULL,NULL,'delete',271,272), +(138,130,NULL,NULL,'import',273,274), +(139,130,NULL,NULL,'export',275,276), +(140,2,NULL,NULL,'Faculties',278,289), +(141,140,NULL,NULL,'index',279,280), +(142,140,NULL,NULL,'view',281,282), +(143,140,NULL,NULL,'add',283,284), +(144,140,NULL,NULL,'edit',285,286), +(145,140,NULL,NULL,'delete',287,288), +(146,2,NULL,NULL,'Rubrics',290,309), +(147,146,NULL,NULL,'postProcess',291,292), +(148,146,NULL,NULL,'setUpAjaxList',293,294), +(149,146,NULL,NULL,'index',295,296), +(150,146,NULL,NULL,'ajaxList',297,298), +(151,146,NULL,NULL,'view',299,300), +(152,146,NULL,NULL,'add',301,302), +(153,146,NULL,NULL,'edit',303,304), +(154,146,NULL,NULL,'copy',305,306), +(155,146,NULL,NULL,'delete',307,308), +(156,2,NULL,NULL,'Events',310,337), +(157,156,NULL,NULL,'postProcessData',311,312), +(158,156,NULL,NULL,'setUpAjaxList',313,314), +(159,156,NULL,NULL,'index',315,316), +(160,156,NULL,NULL,'ajaxList',317,318), +(161,156,NULL,NULL,'view',319,320), +(162,156,NULL,NULL,'add',321,322), +(163,156,NULL,NULL,'setSchedule',323,324), +(164,156,NULL,NULL,'getGroupMembers',325,326), +(165,156,NULL,NULL,'edit',327,328), +(166,156,NULL,NULL,'checkIfChanged',329,330), +(167,156,NULL,NULL,'calculateFrequency',331,332), +(168,156,NULL,NULL,'delete',333,334), +(169,156,NULL,NULL,'checkDuplicateName',335,336), +(170,2,NULL,NULL,'Simpleevaluations',338,357), +(171,170,NULL,NULL,'postProcess',339,340), +(172,170,NULL,NULL,'setUpAjaxList',341,342), +(173,170,NULL,NULL,'index',343,344), +(174,170,NULL,NULL,'ajaxList',345,346), +(175,170,NULL,NULL,'view',347,348), +(176,170,NULL,NULL,'add',349,350), +(177,170,NULL,NULL,'edit',351,352), +(178,170,NULL,NULL,'copy',353,354), +(179,170,NULL,NULL,'delete',355,356), +(180,2,NULL,NULL,'V1',358,393), +(181,180,NULL,NULL,'oauth',359,360), +(182,180,NULL,NULL,'oauth_error',361,362), +(183,180,NULL,NULL,'users',363,364), +(184,180,NULL,NULL,'courses',365,366), +(185,180,NULL,NULL,'groups',367,368), +(186,180,NULL,NULL,'groupMembers',369,370), +(187,180,NULL,NULL,'events',371,372), +(188,180,NULL,NULL,'grades',373,374), +(189,180,NULL,NULL,'departments',375,376), +(190,180,NULL,NULL,'courseDepartments',377,378), +(191,180,NULL,NULL,'userEvents',379,380), +(192,180,NULL,NULL,'enrolment',381,382), +(193,180,NULL,NULL,'add',383,384), +(194,180,NULL,NULL,'edit',385,386), +(195,180,NULL,NULL,'index',387,388), +(196,180,NULL,NULL,'view',389,390), +(197,180,NULL,NULL,'delete',391,392), +(198,2,NULL,NULL,'Departments',394,405), +(199,198,NULL,NULL,'index',395,396), +(200,198,NULL,NULL,'view',397,398), +(201,198,NULL,NULL,'add',399,400), +(202,198,NULL,NULL,'edit',401,402), +(203,198,NULL,NULL,'delete',403,404), +(204,2,NULL,NULL,'Sysparameters',406,421), +(205,204,NULL,NULL,'setUpAjaxList',407,408), +(206,204,NULL,NULL,'index',409,410), +(207,204,NULL,NULL,'ajaxList',411,412), +(208,204,NULL,NULL,'view',413,414), +(209,204,NULL,NULL,'add',415,416), +(210,204,NULL,NULL,'edit',417,418), +(211,204,NULL,NULL,'delete',419,420), +(212,2,NULL,NULL,'Mixevals',422,439), +(213,212,NULL,NULL,'setUpAjaxList',423,424), +(214,212,NULL,NULL,'index',425,426), +(215,212,NULL,NULL,'ajaxList',427,428), +(216,212,NULL,NULL,'view',429,430), +(217,212,NULL,NULL,'add',431,432), +(218,212,NULL,NULL,'edit',433,434), +(219,212,NULL,NULL,'copy',435,436), +(220,212,NULL,NULL,'delete',437,438), +(221,2,NULL,NULL,'Emailtemplates',440,459), +(222,221,NULL,NULL,'setUpAjaxList',441,442), +(223,221,NULL,NULL,'ajaxList',443,444), +(224,221,NULL,NULL,'index',445,446), +(225,221,NULL,NULL,'add',447,448), +(226,221,NULL,NULL,'edit',449,450), +(227,221,NULL,NULL,'delete',451,452), +(228,221,NULL,NULL,'view',453,454), +(229,221,NULL,NULL,'displayTemplateContent',455,456), +(230,221,NULL,NULL,'displayTemplateSubject',457,458), +(231,2,NULL,NULL,'Install',460,481), +(232,231,NULL,NULL,'index',461,462), +(233,231,NULL,NULL,'install2',463,464), +(234,231,NULL,NULL,'install3',465,466), +(235,231,NULL,NULL,'install4',467,468), +(236,231,NULL,NULL,'install5',469,470), +(237,231,NULL,NULL,'gpl',471,472), +(238,231,NULL,NULL,'add',473,474), +(239,231,NULL,NULL,'edit',475,476), +(240,231,NULL,NULL,'view',477,478), +(241,231,NULL,NULL,'delete',479,480), +(242,2,NULL,NULL,'Courses',482,505), +(243,242,NULL,NULL,'daysLate',483,484), +(244,242,NULL,NULL,'index',485,486), +(245,242,NULL,NULL,'ajaxList',487,488), +(246,242,NULL,NULL,'view',489,490), +(247,242,NULL,NULL,'home',491,492), +(248,242,NULL,NULL,'add',493,494), +(249,242,NULL,NULL,'edit',495,496), +(250,242,NULL,NULL,'delete',497,498), +(251,242,NULL,NULL,'move',499,500), +(252,242,NULL,NULL,'ajax_options',501,502), +(253,242,NULL,NULL,'import',503,504), +(254,2,NULL,NULL,'Surveys',506,535), +(255,254,NULL,NULL,'setUpAjaxList',507,508), +(256,254,NULL,NULL,'index',509,510), +(257,254,NULL,NULL,'ajaxList',511,512), +(258,254,NULL,NULL,'view',513,514), +(259,254,NULL,NULL,'add',515,516), +(260,254,NULL,NULL,'edit',517,518), +(261,254,NULL,NULL,'copy',519,520), +(262,254,NULL,NULL,'delete',521,522), +(263,254,NULL,NULL,'questionsSummary',523,524), +(264,254,NULL,NULL,'moveQuestion',525,526), +(265,254,NULL,NULL,'removeQuestion',527,528), +(266,254,NULL,NULL,'addQuestion',529,530), +(267,254,NULL,NULL,'editQuestion',531,532), +(268,254,NULL,NULL,'surveyAccess',533,534), +(269,2,NULL,NULL,'Lti',536,547), +(270,269,NULL,NULL,'index',537,538), +(271,269,NULL,NULL,'add',539,540), +(272,269,NULL,NULL,'edit',541,542), +(273,269,NULL,NULL,'view',543,544), +(274,269,NULL,NULL,'delete',545,546), +(275,2,NULL,NULL,'Emailer',548,575), +(276,275,NULL,NULL,'setUpAjaxList',549,550), +(277,275,NULL,NULL,'ajaxList',551,552), +(278,275,NULL,NULL,'index',553,554), +(279,275,NULL,NULL,'write',555,556), +(280,275,NULL,NULL,'cancel',557,558), +(281,275,NULL,NULL,'view',559,560), +(282,275,NULL,NULL,'addRecipient',561,562), +(283,275,NULL,NULL,'deleteRecipient',563,564), +(284,275,NULL,NULL,'getRecipient',565,566), +(285,275,NULL,NULL,'searchByUserId',567,568), +(286,275,NULL,NULL,'add',569,570), +(287,275,NULL,NULL,'edit',571,572), +(288,275,NULL,NULL,'delete',573,574), +(289,2,NULL,NULL,'Guard',576,593), +(290,289,NULL,NULL,'Guard',577,592), +(291,290,NULL,NULL,'login',578,579), +(292,290,NULL,NULL,'logout',580,581), +(293,290,NULL,NULL,'add',582,583), +(294,290,NULL,NULL,'edit',584,585), +(295,290,NULL,NULL,'index',586,587), +(296,290,NULL,NULL,'view',588,589), +(297,290,NULL,NULL,'delete',590,591), +(298,NULL,NULL,NULL,'functions',595,658), +(299,298,NULL,NULL,'user',596,623), +(300,299,NULL,NULL,'superadmin',597,598), +(301,299,NULL,NULL,'admin',599,600), +(302,299,NULL,NULL,'instructor',601,602), +(303,299,NULL,NULL,'tutor',603,604), +(304,299,NULL,NULL,'student',605,606), +(305,299,NULL,NULL,'import',607,608), +(306,299,NULL,NULL,'password_reset',609,620), +(307,306,NULL,NULL,'superadmin',610,611), +(308,306,NULL,NULL,'admin',612,613), +(309,306,NULL,NULL,'instructor',614,615), +(310,306,NULL,NULL,'tutor',616,617), +(311,306,NULL,NULL,'student',618,619), +(312,299,NULL,NULL,'index',621,622), +(313,298,NULL,NULL,'role',624,635), +(314,313,NULL,NULL,'superadmin',625,626), +(315,313,NULL,NULL,'admin',627,628), +(316,313,NULL,NULL,'instructor',629,630), +(317,313,NULL,NULL,'tutor',631,632), +(318,313,NULL,NULL,'student',633,634), +(319,298,NULL,NULL,'evaluation',636,637), +(320,298,NULL,NULL,'email',638,645), +(321,320,NULL,NULL,'allUsers',639,640), +(322,320,NULL,NULL,'allGroups',641,642), +(323,320,NULL,NULL,'allCourses',643,644), +(324,298,NULL,NULL,'emailtemplate',646,647), +(325,298,NULL,NULL,'viewstudentresults',648,649), +(326,298,NULL,NULL,'viewemailaddresses',650,651), +(327,298,NULL,NULL,'superadmin',652,653), +(328,298,NULL,NULL,'coursemanager',654,655), +(329,298,NULL,NULL,'viewusername',656,657); -- -------------------------------------------------------- @@ -426,122 +427,123 @@ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; INSERT INTO aros_acos (id, aro_id, aco_id, _create, _read, _update, _delete) VALUES -(1, 1, 2, '1', '1', '1', '1'), -(2, 1, 297, '1', '1', '1', '1'), -(3, 1, 1, '1', '1', '1', '1'), -(4, 2, 2, '-1', '-1', '-1', '-1'), -(5, 2, 122, '1', '1', '1', '1'), -(6, 2, 16, '1', '1', '1', '1'), -(7, 2, 28, '1', '1', '1', '1'), -(8, 2, 31, '-1', '-1', '-1', '-1'), -(9, 2, 30, '-1', '-1', '-1', '-1'), -(10, 2, 33, '-1', '-1', '-1', '-1'), -(11, 2, 32, '-1', '-1', '-1', '-1'), -(12, 2, 29, '-1', '-1', '-1', '-1'), -(13, 2, 34, '1', '1', '1', '1'), -(14, 2, 48, '1', '1', '1', '1'), -(15, 2, 58, '1', '1', '1', '1'), -(16, 2, 64, '1', '1', '1', '1'), -(17, 2, 84, '1', '1', '1', '1'), -(18, 2, 112, '1', '1', '1', '1'), -(19, 2, 145, '1', '1', '1', '1'), -(20, 2, 173, '1', '1', '1', '1'), -(21, 2, 197, '1', '1', '1', '1'), -(22, 2, 223, '1', '1', '1', '1'), -(23, 2, 207, '1', '1', '1', '1'), -(24, 2, 253, '1', '1', '1', '1'), -(25, 2, 291, '1', '1', '1', '1'), -(26, 2, 297, '-1', '-1', '-1', '-1'), -(27, 2, 323, '1', '1', '1', '1'), -(28, 2, 318, '1', '1', '1', '1'), -(29, 2, 320, '1', '1', '1', '1'), -(30, 2, 298, '1', '1', '1', '1'), -(31, 2, 300, '1', '1', '1', '-1'), -(32, 2, 299, '-1', '-1', '-1', '-1'), -(33, 2, 325, '1', '1', '1', '1'), -(34, 2, 328, '1', '1', '1', '1'), -(35, 2, 327, '1', '1', '1', '1'), -(36, 2, 326, '-1', '-1', '-1', '-1'), -(37, 3, 2, '-1', '-1', '-1', '-1'), -(38, 3, 122, '1', '1', '1', '1'), -(39, 3, 16, '1', '1', '1', '1'), -(40, 3, 34, '1', '1', '1', '1'), -(41, 3, 48, '1', '1', '1', '1'), -(42, 3, 58, '1', '1', '1', '1'), -(43, 3, 64, '1', '1', '1', '1'), -(44, 3, 84, '1', '1', '1', '1'), -(45, 3, 112, '1', '1', '1', '1'), -(46, 3, 145, '1', '1', '1', '1'), -(47, 3, 173, '1', '1', '1', '1'), -(48, 3, 197, '1', '1', '1', '1'), -(49, 3, 223, '1', '1', '1', '1'), -(50, 3, 207, '1', '1', '1', '1'), -(51, 3, 253, '1', '1', '1', '1'), -(52, 3, 291, '1', '1', '1', '1'), -(53, 3, 156, '1', '1', '1', '1'), -(54, 3, 158, '1', '1', '1', '1'), -(55, 3, 162, '1', '1', '1', '1'), -(56, 3, 164, '1', '1', '1', '1'), -(57, 3, 267, '-1', '-1', '-1', '-1'), -(58, 3, 297, '-1', '-1', '-1', '-1'), -(59, 3, 318, '1', '1', '-1', '-1'), -(60, 3, 298, '1', '1', '1', '1'), -(61, 3, 300, '-1', '-1', '-1', '-1'), -(62, 3, 299, '-1', '-1', '-1', '-1'), -(63, 3, 301, '-1', '1', '-1', '-1'), -(64, 3, 311, '-1', '-1', '-1', '-1'), -(65, 3, 325, '-1', '-1', '-1', '-1'), -(66, 3, 326, '-1', '-1', '-1', '-1'), -(67, 3, 327, '1', '1', '1', '1'), -(68, 4, 2, '-1', '-1', '-1', '-1'), -(69, 4, 122, '1', '1', '1', '1'), -(70, 4, 16, '-1', '-1', '-1', '-1'), -(71, 4, 34, '-1', '-1', '-1', '-1'), -(72, 4, 48, '-1', '-1', '-1', '-1'), -(73, 4, 58, '-1', '-1', '-1', '-1'), -(74, 4, 84, '-1', '-1', '-1', '-1'), -(75, 4, 112, '-1', '-1', '-1', '-1'), -(76, 4, 145, '-1', '-1', '-1', '-1'), -(77, 4, 173, '-1', '-1', '-1', '-1'), -(78, 4, 197, '-1', '-1', '-1', '-1'), -(79, 4, 223, '-1', '-1', '-1', '-1'), -(80, 4, 207, '-1', '-1', '-1', '-1'), -(81, 4, 253, '-1', '-1', '-1', '-1'), -(82, 4, 291, '1', '1', '1', '1'), -(83, 4, 70, '1', '1', '1', '1'), -(84, 4, 73, '1', '1', '1', '1'), -(85, 4, 71, '1', '1', '1', '1'), -(86, 4, 262, '1', '1', '1', '1'), -(87, 4, 297, '-1', '-1', '-1', '-1'), -(88, 4, 325, '-1', '-1', '-1', '-1'), -(89, 4, 326, '-1', '-1', '-1', '-1'), -(90, 5, 2, '-1', '-1', '-1', '-1'), -(91, 5, 122, '1', '1', '1', '1'), -(92, 5, 16, '-1', '-1', '-1', '-1'), -(93, 5, 34, '-1', '-1', '-1', '-1'), -(94, 5, 48, '-1', '-1', '-1', '-1'), -(95, 5, 58, '-1', '-1', '-1', '-1'), -(96, 5, 84, '-1', '-1', '-1', '-1'), -(97, 5, 112, '-1', '-1', '-1', '-1'), -(98, 5, 145, '-1', '-1', '-1', '-1'), -(99, 5, 173, '-1', '-1', '-1', '-1'), -(100, 5, 197, '-1', '-1', '-1', '-1'), -(101, 5, 223, '-1', '-1', '-1', '-1'), -(102, 5, 207, '-1', '-1', '-1', '-1'), -(103, 5, 253, '-1', '-1', '-1', '-1'), -(104, 5, 291, '1', '1', '1', '1'), -(105, 5, 70, '1', '1', '1', '1'), -(106, 5, 73, '1', '1', '1', '1'), -(107, 5, 71, '1', '1', '1', '1'), -(108, 5, 262, '1', '1', '1', '1'), -(109, 5, 156, '1', '1', '1', '1'), -(110, 5, 158, '1', '1', '1', '1'), -(111, 5, 162, '1', '1', '1', '1'), -(112, 5, 164, '1', '1', '1', '1'), -(113, 5, 297, '-1', '-1', '-1', '-1'), -(114, 5, 324, '1', '1', '1', '1'), -(115, 5, 325, '-1', '-1', '-1', '-1'), -(116, 5, 326, '-1', '-1', '-1', '-1'); +(1,1,2,'1','1','1','1'), +(2,1,298,'1','1','1','1'), +(3,1,1,'1','1','1','1'), +(4,2,2,'-1','-1','-1','-1'), +(5,2,56,'1','1','1','1'), +(6,2,242,'1','1','1','1'), +(7,2,198,'1','1','1','1'), +(8,2,201,'-1','-1','-1','-1'), +(9,2,200,'-1','-1','-1','-1'), +(10,2,203,'-1','-1','-1','-1'), +(11,2,202,'-1','-1','-1','-1'), +(12,2,199,'-1','-1','-1','-1'), +(13,2,275,'1','1','1','1'), +(14,2,221,'1','1','1','1'), +(15,2,117,'1','1','1','1'), +(16,2,91,'1','1','1','1'), +(17,2,156,'1','1','1','1'), +(18,2,130,'1','1','1','1'), +(19,2,212,'1','1','1','1'), +(20,2,146,'1','1','1','1'), +(21,2,170,'1','1','1','1'), +(22,2,254,'1','1','1','1'), +(23,2,68,'1','1','1','1'), +(24,2,24,'1','1','1','1'), +(25,2,292,'1','1','1','1'), +(26,2,298,'-1','-1','-1','-1'), +(27,2,324,'1','1','1','1'), +(28,2,319,'1','1','1','1'), +(29,2,321,'1','1','1','1'), +(30,2,299,'1','1','1','1'), +(31,2,301,'1','1','1','-1'), +(32,2,300,'-1','-1','-1','-1'), +(33,2,326,'1','1','1','1'), +(34,2,329,'1','1','1','1'), +(35,2,328,'1','1','1','1'), +(36,2,327,'-1','-1','-1','-1'), +(37,3,2,'-1','-1','-1','-1'), +(38,3,56,'1','1','1','1'), +(39,3,242,'1','1','1','1'), +(40,3,275,'1','1','1','1'), +(41,3,221,'1','1','1','1'), +(42,3,117,'1','1','1','1'), +(43,3,91,'1','1','1','1'), +(44,3,156,'1','1','1','1'), +(45,3,130,'1','1','1','1'), +(46,3,212,'1','1','1','1'), +(47,3,146,'1','1','1','1'), +(48,3,170,'1','1','1','1'), +(49,3,254,'1','1','1','1'), +(50,3,68,'1','1','1','1'), +(51,3,24,'1','1','1','1'), +(52,3,292,'1','1','1','1'), +(53,3,44,'1','1','1','1'), +(54,3,46,'1','1','1','1'), +(55,3,113,'1','1','1','1'), +(56,3,115,'1','1','1','1'), +(57,3,38,'-1','-1','-1','-1'), +(58,3,41,'1','1','1','1'), +(59,3,298,'-1','-1','-1','-1'), +(60,3,319,'1','1','-1','-1'), +(61,3,299,'1','1','1','1'), +(62,3,301,'-1','-1','-1','-1'), +(63,3,300,'-1','-1','-1','-1'), +(64,3,302,'-1','1','-1','-1'), +(65,3,312,'-1','-1','-1','-1'), +(66,3,326,'-1','-1','-1','-1'), +(67,3,327,'-1','-1','-1','-1'), +(68,3,328,'1','1','1','1'), +(69,4,2,'-1','-1','-1','-1'), +(70,4,56,'1','1','1','1'), +(71,4,242,'-1','-1','-1','-1'), +(72,4,275,'-1','-1','-1','-1'), +(73,4,221,'-1','-1','-1','-1'), +(74,4,117,'-1','-1','-1','-1'), +(75,4,156,'-1','-1','-1','-1'), +(76,4,130,'-1','-1','-1','-1'), +(77,4,212,'-1','-1','-1','-1'), +(78,4,146,'-1','-1','-1','-1'), +(79,4,170,'-1','-1','-1','-1'), +(80,4,254,'-1','-1','-1','-1'), +(81,4,68,'-1','-1','-1','-1'), +(82,4,24,'-1','-1','-1','-1'), +(83,4,292,'1','1','1','1'), +(84,4,97,'1','1','1','1'), +(85,4,100,'1','1','1','1'), +(86,4,98,'1','1','1','1'), +(87,4,33,'1','1','1','1'), +(88,4,298,'-1','-1','-1','-1'), +(89,4,326,'-1','-1','-1','-1'), +(90,4,327,'-1','-1','-1','-1'), +(91,5,2,'-1','-1','-1','-1'), +(92,5,56,'1','1','1','1'), +(93,5,242,'-1','-1','-1','-1'), +(94,5,275,'-1','-1','-1','-1'), +(95,5,221,'-1','-1','-1','-1'), +(96,5,117,'-1','-1','-1','-1'), +(97,5,156,'-1','-1','-1','-1'), +(98,5,130,'-1','-1','-1','-1'), +(99,5,212,'-1','-1','-1','-1'), +(100,5,146,'-1','-1','-1','-1'), +(101,5,170,'-1','-1','-1','-1'), +(102,5,254,'-1','-1','-1','-1'), +(103,5,68,'-1','-1','-1','-1'), +(104,5,24,'-1','-1','-1','-1'), +(105,5,292,'1','1','1','1'), +(106,5,97,'1','1','1','1'), +(107,5,100,'1','1','1','1'), +(108,5,98,'1','1','1','1'), +(109,5,33,'1','1','1','1'), +(110,5,44,'1','1','1','1'), +(111,5,46,'1','1','1','1'), +(112,5,113,'1','1','1','1'), +(113,5,115,'1','1','1','1'), +(114,5,298,'-1','-1','-1','-1'), +(115,5,325,'1','1','1','1'), +(116,5,326,'-1','-1','-1','-1'), +(117,5,327,'-1','-1','-1','-1'); -- -------------------------------------------------------- diff --git a/app/config/sql/ipeer_samples_data.sql b/app/config/sql/ipeer_samples_data.sql index 08ef1edc5..6aa907028 100644 --- a/app/config/sql/ipeer_samples_data.sql +++ b/app/config/sql/ipeer_samples_data.sql @@ -36,334 +36,335 @@ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101 SET NAMES utf8 */; INSERT INTO acos (id, parent_id, model, foreign_key, alias, lft, rght) VALUES -(1, NULL, NULL, NULL, 'adminpage', 1, 2), -(2, NULL, NULL, NULL, 'controllers', 3, 592), -(3, 2, NULL, NULL, 'Pages', 4, 17), -(4, 3, NULL, NULL, 'display', 5, 6), -(5, 3, NULL, NULL, 'add', 7, 8), -(6, 3, NULL, NULL, 'edit', 9, 10), -(7, 3, NULL, NULL, 'index', 11, 12), -(8, 3, NULL, NULL, 'view', 13, 14), -(9, 3, NULL, NULL, 'delete', 15, 16), -(10, 2, NULL, NULL, 'Accesses', 18, 29), -(11, 10, NULL, NULL, 'view', 19, 20), -(12, 10, NULL, NULL, 'edit', 21, 22), -(13, 10, NULL, NULL, 'add', 23, 24), -(14, 10, NULL, NULL, 'index', 25, 26), -(15, 10, NULL, NULL, 'delete', 27, 28), -(16, 2, NULL, NULL, 'Courses', 30, 53), -(17, 16, NULL, NULL, 'daysLate', 31, 32), -(18, 16, NULL, NULL, 'index', 33, 34), -(19, 16, NULL, NULL, 'ajaxList', 35, 36), -(20, 16, NULL, NULL, 'view', 37, 38), -(21, 16, NULL, NULL, 'home', 39, 40), -(22, 16, NULL, NULL, 'add', 41, 42), -(23, 16, NULL, NULL, 'edit', 43, 44), -(24, 16, NULL, NULL, 'delete', 45, 46), -(25, 16, NULL, NULL, 'move', 47, 48), -(26, 16, NULL, NULL, 'ajax_options', 49, 50), -(27, 16, NULL, NULL, 'import', 51, 52), -(28, 2, NULL, NULL, 'Departments', 54, 65), -(29, 28, NULL, NULL, 'index', 55, 56), -(30, 28, NULL, NULL, 'view', 57, 58), -(31, 28, NULL, NULL, 'add', 59, 60), -(32, 28, NULL, NULL, 'edit', 61, 62), -(33, 28, NULL, NULL, 'delete', 63, 64), -(34, 2, NULL, NULL, 'Emailer', 66, 93), -(35, 34, NULL, NULL, 'setUpAjaxList', 67, 68), -(36, 34, NULL, NULL, 'ajaxList', 69, 70), -(37, 34, NULL, NULL, 'index', 71, 72), -(38, 34, NULL, NULL, 'write', 73, 74), -(39, 34, NULL, NULL, 'cancel', 75, 76), -(40, 34, NULL, NULL, 'view', 77, 78), -(41, 34, NULL, NULL, 'addRecipient', 79, 80), -(42, 34, NULL, NULL, 'deleteRecipient', 81, 82), -(43, 34, NULL, NULL, 'getRecipient', 83, 84), -(44, 34, NULL, NULL, 'searchByUserId', 85, 86), -(45, 34, NULL, NULL, 'add', 87, 88), -(46, 34, NULL, NULL, 'edit', 89, 90), -(47, 34, NULL, NULL, 'delete', 91, 92), -(48, 2, NULL, NULL, 'Emailtemplates', 94, 113), -(49, 48, NULL, NULL, 'setUpAjaxList', 95, 96), -(50, 48, NULL, NULL, 'ajaxList', 97, 98), -(51, 48, NULL, NULL, 'index', 99, 100), -(52, 48, NULL, NULL, 'add', 101, 102), -(53, 48, NULL, NULL, 'edit', 103, 104), -(54, 48, NULL, NULL, 'delete', 105, 106), -(55, 48, NULL, NULL, 'view', 107, 108), -(56, 48, NULL, NULL, 'displayTemplateContent', 109, 110), -(57, 48, NULL, NULL, 'displayTemplateSubject', 111, 112), -(58, 2, NULL, NULL, 'Evaltools', 114, 125), -(59, 58, NULL, NULL, 'index', 115, 116), -(60, 58, NULL, NULL, 'add', 117, 118), -(61, 58, NULL, NULL, 'edit', 119, 120), -(62, 58, NULL, NULL, 'view', 121, 122), -(63, 58, NULL, NULL, 'delete', 123, 124), -(64, 2, NULL, NULL, 'Evaluations', 126, 165), -(65, 64, NULL, NULL, 'setUpAjaxList', 127, 128), -(66, 64, NULL, NULL, 'ajaxList', 129, 130), -(67, 64, NULL, NULL, 'view', 131, 132), -(68, 64, NULL, NULL, 'index', 133, 134), -(69, 64, NULL, NULL, 'export', 135, 136), -(70, 64, NULL, NULL, 'makeEvaluation', 137, 138), -(71, 64, NULL, NULL, 'completeEvaluationRubric', 139, 140), -(72, 64, NULL, NULL, 'viewEvaluationResults', 141, 142), -(73, 64, NULL, NULL, 'studentViewEvaluationResult', 143, 144), -(74, 64, NULL, NULL, 'markEventReviewed', 145, 146), -(75, 64, NULL, NULL, 'markGradeRelease', 147, 148), -(76, 64, NULL, NULL, 'markCommentRelease', 149, 150), -(77, 64, NULL, NULL, 'changeAllCommentRelease', 151, 152), -(78, 64, NULL, NULL, 'changeAllGradeRelease', 153, 154), -(79, 64, NULL, NULL, 'viewGroupSubmissionDetails', 155, 156), -(80, 64, NULL, NULL, 'viewSurveySummary', 157, 158), -(81, 64, NULL, NULL, 'add', 159, 160), -(82, 64, NULL, NULL, 'edit', 161, 162), -(83, 64, NULL, NULL, 'delete', 163, 164), -(84, 2, NULL, NULL, 'Events', 166, 193), -(85, 84, NULL, NULL, 'postProcessData', 167, 168), -(86, 84, NULL, NULL, 'setUpAjaxList', 169, 170), -(87, 84, NULL, NULL, 'index', 171, 172), -(88, 84, NULL, NULL, 'ajaxList', 173, 174), -(89, 84, NULL, NULL, 'view', 175, 176), -(90, 84, NULL, NULL, 'add', 177, 178), -(91, 84, NULL, NULL, 'setSchedule', 179, 180), -(92, 84, NULL, NULL, 'getGroupMembers', 181, 182), -(93, 84, NULL, NULL, 'edit', 183, 184), -(94, 84, NULL, NULL, 'checkIfChanged', 185, 186), -(95, 84, NULL, NULL, 'calculateFrequency', 187, 188), -(96, 84, NULL, NULL, 'delete', 189, 190), -(97, 84, NULL, NULL, 'checkDuplicateName', 191, 192), -(98, 2, NULL, NULL, 'Faculties', 194, 205), -(99, 98, NULL, NULL, 'index', 195, 196), -(100, 98, NULL, NULL, 'view', 197, 198), -(101, 98, NULL, NULL, 'add', 199, 200), -(102, 98, NULL, NULL, 'edit', 201, 202), -(103, 98, NULL, NULL, 'delete', 203, 204), -(104, 2, NULL, NULL, 'Framework', 206, 221), -(105, 104, NULL, NULL, 'calendarDisplay', 207, 208), -(106, 104, NULL, NULL, 'tutIndex', 209, 210), -(107, 104, NULL, NULL, 'add', 211, 212), -(108, 104, NULL, NULL, 'edit', 213, 214), -(109, 104, NULL, NULL, 'index', 215, 216), -(110, 104, NULL, NULL, 'view', 217, 218), -(111, 104, NULL, NULL, 'delete', 219, 220), -(112, 2, NULL, NULL, 'Groups', 222, 241), -(113, 112, NULL, NULL, 'setUpAjaxList', 223, 224), -(114, 112, NULL, NULL, 'index', 225, 226), -(115, 112, NULL, NULL, 'ajaxList', 227, 228), -(116, 112, NULL, NULL, 'view', 229, 230), -(117, 112, NULL, NULL, 'add', 231, 232), -(118, 112, NULL, NULL, 'edit', 233, 234), -(119, 112, NULL, NULL, 'delete', 235, 236), -(120, 112, NULL, NULL, 'import', 237, 238), -(121, 112, NULL, NULL, 'export', 239, 240), -(122, 2, NULL, NULL, 'Home', 242, 253), -(123, 122, NULL, NULL, 'index', 243, 244), -(124, 122, NULL, NULL, 'add', 245, 246), -(125, 122, NULL, NULL, 'edit', 247, 248), -(126, 122, NULL, NULL, 'view', 249, 250), -(127, 122, NULL, NULL, 'delete', 251, 252), -(128, 2, NULL, NULL, 'Install', 254, 275), -(129, 128, NULL, NULL, 'index', 255, 256), -(130, 128, NULL, NULL, 'install2', 257, 258), -(131, 128, NULL, NULL, 'install3', 259, 260), -(132, 128, NULL, NULL, 'install4', 261, 262), -(133, 128, NULL, NULL, 'install5', 263, 264), -(134, 128, NULL, NULL, 'gpl', 265, 266), -(135, 128, NULL, NULL, 'add', 267, 268), -(136, 128, NULL, NULL, 'edit', 269, 270), -(137, 128, NULL, NULL, 'view', 271, 272), -(138, 128, NULL, NULL, 'delete', 273, 274), -(139, 2, NULL, NULL, 'Lti', 276, 287), -(140, 139, NULL, NULL, 'index', 277, 278), -(141, 139, NULL, NULL, 'add', 279, 280), -(142, 139, NULL, NULL, 'edit', 281, 282), -(143, 139, NULL, NULL, 'view', 283, 284), -(144, 139, NULL, NULL, 'delete', 285, 286), -(145, 2, NULL, NULL, 'Mixevals', 288, 305), -(146, 145, NULL, NULL, 'setUpAjaxList', 289, 290), -(147, 145, NULL, NULL, 'index', 291, 292), -(148, 145, NULL, NULL, 'ajaxList', 293, 294), -(149, 145, NULL, NULL, 'view', 295, 296), -(150, 145, NULL, NULL, 'add', 297, 298), -(151, 145, NULL, NULL, 'edit', 299, 300), -(152, 145, NULL, NULL, 'copy', 301, 302), -(153, 145, NULL, NULL, 'delete', 303, 304), -(154, 2, NULL, NULL, 'Oauthclients', 306, 317), -(155, 154, NULL, NULL, 'index', 307, 308), -(156, 154, NULL, NULL, 'add', 309, 310), -(157, 154, NULL, NULL, 'edit', 311, 312), -(158, 154, NULL, NULL, 'delete', 313, 314), -(159, 154, NULL, NULL, 'view', 315, 316), -(160, 2, NULL, NULL, 'Oauthtokens', 318, 329), -(161, 160, NULL, NULL, 'index', 319, 320), -(162, 160, NULL, NULL, 'add', 321, 322), -(163, 160, NULL, NULL, 'edit', 323, 324), -(164, 160, NULL, NULL, 'delete', 325, 326), -(165, 160, NULL, NULL, 'view', 327, 328), -(166, 2, NULL, NULL, 'Penalty', 330, 343), -(167, 166, NULL, NULL, 'save', 331, 332), -(168, 166, NULL, NULL, 'add', 333, 334), -(169, 166, NULL, NULL, 'edit', 335, 336), -(170, 166, NULL, NULL, 'index', 337, 338), -(171, 166, NULL, NULL, 'view', 339, 340), -(172, 166, NULL, NULL, 'delete', 341, 342), -(173, 2, NULL, NULL, 'Rubrics', 344, 363), -(174, 173, NULL, NULL, 'postProcess', 345, 346), -(175, 173, NULL, NULL, 'setUpAjaxList', 347, 348), -(176, 173, NULL, NULL, 'index', 349, 350), -(177, 173, NULL, NULL, 'ajaxList', 351, 352), -(178, 173, NULL, NULL, 'view', 353, 354), -(179, 173, NULL, NULL, 'add', 355, 356), -(180, 173, NULL, NULL, 'edit', 357, 358), -(181, 173, NULL, NULL, 'copy', 359, 360), -(182, 173, NULL, NULL, 'delete', 361, 362), -(183, 2, NULL, NULL, 'Searchs', 364, 391), -(184, 183, NULL, NULL, 'update', 365, 366), -(185, 183, NULL, NULL, 'index', 367, 368), -(186, 183, NULL, NULL, 'searchEvaluation', 369, 370), -(187, 183, NULL, NULL, 'searchResult', 371, 372), -(188, 183, NULL, NULL, 'searchInstructor', 373, 374), -(189, 183, NULL, NULL, 'eventBoxSearch', 375, 376), -(190, 183, NULL, NULL, 'formatSearchEvaluation', 377, 378), -(191, 183, NULL, NULL, 'formatSearchInstructor', 379, 380), -(192, 183, NULL, NULL, 'formatSearchEvaluationResult', 381, 382), -(193, 183, NULL, NULL, 'add', 383, 384), -(194, 183, NULL, NULL, 'edit', 385, 386), -(195, 183, NULL, NULL, 'view', 387, 388), -(196, 183, NULL, NULL, 'delete', 389, 390), -(197, 2, NULL, NULL, 'Simpleevaluations', 392, 411), -(198, 197, NULL, NULL, 'postProcess', 393, 394), -(199, 197, NULL, NULL, 'setUpAjaxList', 395, 396), -(200, 197, NULL, NULL, 'index', 397, 398), -(201, 197, NULL, NULL, 'ajaxList', 399, 400), -(202, 197, NULL, NULL, 'view', 401, 402), -(203, 197, NULL, NULL, 'add', 403, 404), -(204, 197, NULL, NULL, 'edit', 405, 406), -(205, 197, NULL, NULL, 'copy', 407, 408), -(206, 197, NULL, NULL, 'delete', 409, 410), -(207, 2, NULL, NULL, 'Surveygroups', 412, 443), -(208, 207, NULL, NULL, 'postProcess', 413, 414), -(209, 207, NULL, NULL, 'setUpAjaxList', 415, 416), -(210, 207, NULL, NULL, 'index', 417, 418), -(211, 207, NULL, NULL, 'ajaxList', 419, 420), -(212, 207, NULL, NULL, 'makegroups', 421, 422), -(213, 207, NULL, NULL, 'makegroupssearch', 423, 424), -(214, 207, NULL, NULL, 'maketmgroups', 425, 426), -(215, 207, NULL, NULL, 'savegroups', 427, 428), -(216, 207, NULL, NULL, 'export', 429, 430), -(217, 207, NULL, NULL, 'release', 431, 432), -(218, 207, NULL, NULL, 'delete', 433, 434), -(219, 207, NULL, NULL, 'edit', 435, 436), -(220, 207, NULL, NULL, 'changegroupset', 437, 438), -(221, 207, NULL, NULL, 'add', 439, 440), -(222, 207, NULL, NULL, 'view', 441, 442), -(223, 2, NULL, NULL, 'Surveys', 444, 473), -(224, 223, NULL, NULL, 'setUpAjaxList', 445, 446), -(225, 223, NULL, NULL, 'index', 447, 448), -(226, 223, NULL, NULL, 'ajaxList', 449, 450), -(227, 223, NULL, NULL, 'view', 451, 452), -(228, 223, NULL, NULL, 'add', 453, 454), -(229, 223, NULL, NULL, 'edit', 455, 456), -(230, 223, NULL, NULL, 'copy', 457, 458), -(231, 223, NULL, NULL, 'delete', 459, 460), -(232, 223, NULL, NULL, 'questionsSummary', 461, 462), -(233, 223, NULL, NULL, 'moveQuestion', 463, 464), -(234, 223, NULL, NULL, 'removeQuestion', 465, 466), -(235, 223, NULL, NULL, 'addQuestion', 467, 468), -(236, 223, NULL, NULL, 'editQuestion', 469, 470), -(237, 223, NULL, NULL, 'surveyAccess', 471, 472), -(238, 2, NULL, NULL, 'Sysparameters', 474, 489), -(239, 238, NULL, NULL, 'setUpAjaxList', 475, 476), -(240, 238, NULL, NULL, 'index', 477, 478), -(241, 238, NULL, NULL, 'ajaxList', 479, 480), -(242, 238, NULL, NULL, 'view', 481, 482), -(243, 238, NULL, NULL, 'add', 483, 484), -(244, 238, NULL, NULL, 'edit', 485, 486), -(245, 238, NULL, NULL, 'delete', 487, 488), -(246, 2, NULL, NULL, 'Upgrade', 490, 503), -(247, 246, NULL, NULL, 'index', 491, 492), -(248, 246, NULL, NULL, 'step2', 493, 494), -(249, 246, NULL, NULL, 'add', 495, 496), -(250, 246, NULL, NULL, 'edit', 497, 498), -(251, 246, NULL, NULL, 'view', 499, 500), -(252, 246, NULL, NULL, 'delete', 501, 502), -(253, 2, NULL, NULL, 'Users', 504, 537), -(254, 253, NULL, NULL, 'ajaxList', 505, 506), -(255, 253, NULL, NULL, 'index', 507, 508), -(256, 253, NULL, NULL, 'goToClassList', 509, 510), -(257, 253, NULL, NULL, 'determineIfStudentFromThisData', 511, 512), -(258, 253, NULL, NULL, 'view', 513, 514), -(259, 253, NULL, NULL, 'add', 515, 516), -(260, 253, NULL, NULL, 'enrol', 517, 518), -(261, 253, NULL, NULL, 'edit', 519, 520), -(262, 253, NULL, NULL, 'editProfile', 521, 522), -(263, 253, NULL, NULL, 'delete', 523, 524), -(264, 253, NULL, NULL, 'checkDuplicateName', 525, 526), -(265, 253, NULL, NULL, 'resetPassword', 527, 528), -(266, 253, NULL, NULL, 'import', 529, 530), -(267, 253, NULL, NULL, 'merge', 531, 532), -(268, 253, NULL, NULL, 'ajax_merge', 533, 534), -(269, 253, NULL, NULL, 'update', 535, 536), -(270, 2, NULL, NULL, 'V1', 538, 573), -(271, 270, NULL, NULL, 'oauth', 539, 540), -(272, 270, NULL, NULL, 'oauth_error', 541, 542), -(273, 270, NULL, NULL, 'users', 543, 544), -(274, 270, NULL, NULL, 'courses', 545, 546), -(275, 270, NULL, NULL, 'groups', 547, 548), -(276, 270, NULL, NULL, 'groupMembers', 549, 550), -(277, 270, NULL, NULL, 'events', 551, 552), -(278, 270, NULL, NULL, 'grades', 553, 554), -(279, 270, NULL, NULL, 'departments', 555, 556), -(280, 270, NULL, NULL, 'courseDepartments', 557, 558), -(281, 270, NULL, NULL, 'userEvents', 559, 560), -(282, 270, NULL, NULL, 'enrolment', 561, 562), -(283, 270, NULL, NULL, 'add', 563, 564), -(284, 270, NULL, NULL, 'edit', 565, 566), -(285, 270, NULL, NULL, 'index', 567, 568), -(286, 270, NULL, NULL, 'view', 569, 570), -(287, 270, NULL, NULL, 'delete', 571, 572), -(288, 2, NULL, NULL, 'Guard', 574, 591), -(289, 288, NULL, NULL, 'Guard', 575, 590), -(290, 289, NULL, NULL, 'login', 576, 577), -(291, 289, NULL, NULL, 'logout', 578, 579), -(292, 289, NULL, NULL, 'add', 580, 581), -(293, 289, NULL, NULL, 'edit', 582, 583), -(294, 289, NULL, NULL, 'index', 584, 585), -(295, 289, NULL, NULL, 'view', 586, 587), -(296, 289, NULL, NULL, 'delete', 588, 589), -(297, NULL, NULL, NULL, 'functions', 593, 656), -(298, 297, NULL, NULL, 'user', 594, 621), -(299, 298, NULL, NULL, 'superadmin', 595, 596), -(300, 298, NULL, NULL, 'admin', 597, 598), -(301, 298, NULL, NULL, 'instructor', 599, 600), -(302, 298, NULL, NULL, 'tutor', 601, 602), -(303, 298, NULL, NULL, 'student', 603, 604), -(304, 298, NULL, NULL, 'import', 605, 606), -(305, 298, NULL, NULL, 'password_reset', 607, 618), -(306, 305, NULL, NULL, 'superadmin', 608, 609), -(307, 305, NULL, NULL, 'admin', 610, 611), -(308, 305, NULL, NULL, 'instructor', 612, 613), -(309, 305, NULL, NULL, 'tutor', 614, 615), -(310, 305, NULL, NULL, 'student', 616, 617), -(311, 298, NULL, NULL, 'index', 619, 620), -(312, 297, NULL, NULL, 'role', 622, 633), -(313, 312, NULL, NULL, 'superadmin', 623, 624), -(314, 312, NULL, NULL, 'admin', 625, 626), -(315, 312, NULL, NULL, 'instructor', 627, 628), -(316, 312, NULL, NULL, 'tutor', 629, 630), -(317, 312, NULL, NULL, 'student', 631, 632), -(318, 297, NULL, NULL, 'evaluation', 634, 635), -(319, 297, NULL, NULL, 'email', 636, 643), -(320, 319, NULL, NULL, 'allUsers', 637, 638), -(321, 319, NULL, NULL, 'allGroups', 639, 640), -(322, 319, NULL, NULL, 'allCourses', 641, 642), -(323, 297, NULL, NULL, 'emailtemplate', 644, 645), -(324, 297, NULL, NULL, 'viewstudentresults', 646, 647), -(325, 297, NULL, NULL, 'viewemailaddresses', 648, 649), -(326, 297, NULL, NULL, 'superadmin', 650, 651), -(327, 297, NULL, NULL, 'coursemanager', 652, 653), -(328, 297, NULL, NULL, 'viewusername', 654, 655); +(1,NULL,NULL,NULL,'adminpage',1,2), +(2,NULL,NULL,NULL,'controllers',3,594), +(3,2,NULL,NULL,'Pages',4,17), +(4,3,NULL,NULL,'display',5,6), +(5,3,NULL,NULL,'add',7,8), +(6,3,NULL,NULL,'edit',9,10), +(7,3,NULL,NULL,'index',11,12), +(8,3,NULL,NULL,'view',13,14), +(9,3,NULL,NULL,'delete',15,16), +(10,2,NULL,NULL,'Searchs',18,45), +(11,10,NULL,NULL,'update',19,20), +(12,10,NULL,NULL,'index',21,22), +(13,10,NULL,NULL,'searchEvaluation',23,24), +(14,10,NULL,NULL,'searchResult',25,26), +(15,10,NULL,NULL,'searchInstructor',27,28), +(16,10,NULL,NULL,'eventBoxSearch',29,30), +(17,10,NULL,NULL,'formatSearchEvaluation',31,32), +(18,10,NULL,NULL,'formatSearchInstructor',33,34), +(19,10,NULL,NULL,'formatSearchEvaluationResult',35,36), +(20,10,NULL,NULL,'add',37,38), +(21,10,NULL,NULL,'edit',39,40), +(22,10,NULL,NULL,'view',41,42), +(23,10,NULL,NULL,'delete',43,44), +(24,2,NULL,NULL,'Users',46,81), +(25,24,NULL,NULL,'ajaxList',47,48), +(26,24,NULL,NULL,'index',49,50), +(27,24,NULL,NULL,'goToClassList',51,52), +(28,24,NULL,NULL,'determineIfStudentFromThisData',53,54), +(29,24,NULL,NULL,'view',55,56), +(30,24,NULL,NULL,'add',57,58), +(31,24,NULL,NULL,'enrol',59,60), +(32,24,NULL,NULL,'edit',61,62), +(33,24,NULL,NULL,'editProfile',63,64), +(34,24,NULL,NULL,'delete',65,66), +(35,24,NULL,NULL,'checkDuplicateName',67,68), +(36,24,NULL,NULL,'resetPassword',69,70), +(37,24,NULL,NULL,'import',71,72), +(38,24,NULL,NULL,'merge',73,74), +(39,24,NULL,NULL,'ajax_merge',75,76), +(40,24,NULL,NULL,'update',77,78), +(41,24,NULL,NULL,'showEvents',79,80), +(42,2,NULL,NULL,'Oauthclients',82,93), +(43,42,NULL,NULL,'index',83,84), +(44,42,NULL,NULL,'add',85,86), +(45,42,NULL,NULL,'edit',87,88), +(46,42,NULL,NULL,'delete',89,90), +(47,42,NULL,NULL,'view',91,92), +(48,2,NULL,NULL,'Framework',94,109), +(49,48,NULL,NULL,'calendarDisplay',95,96), +(50,48,NULL,NULL,'tutIndex',97,98), +(51,48,NULL,NULL,'add',99,100), +(52,48,NULL,NULL,'edit',101,102), +(53,48,NULL,NULL,'index',103,104), +(54,48,NULL,NULL,'view',105,106), +(55,48,NULL,NULL,'delete',107,108), +(56,2,NULL,NULL,'Home',110,121), +(57,56,NULL,NULL,'index',111,112), +(58,56,NULL,NULL,'add',113,114), +(59,56,NULL,NULL,'edit',115,116), +(60,56,NULL,NULL,'view',117,118), +(61,56,NULL,NULL,'delete',119,120), +(62,2,NULL,NULL,'Accesses',122,133), +(63,62,NULL,NULL,'view',123,124), +(64,62,NULL,NULL,'edit',125,126), +(65,62,NULL,NULL,'add',127,128), +(66,62,NULL,NULL,'index',129,130), +(67,62,NULL,NULL,'delete',131,132), +(68,2,NULL,NULL,'Surveygroups',134,165), +(69,68,NULL,NULL,'postProcess',135,136), +(70,68,NULL,NULL,'setUpAjaxList',137,138), +(71,68,NULL,NULL,'index',139,140), +(72,68,NULL,NULL,'ajaxList',141,142), +(73,68,NULL,NULL,'makegroups',143,144), +(74,68,NULL,NULL,'makegroupssearch',145,146), +(75,68,NULL,NULL,'maketmgroups',147,148), +(76,68,NULL,NULL,'savegroups',149,150), +(77,68,NULL,NULL,'release',151,152), +(78,68,NULL,NULL,'delete',153,154), +(79,68,NULL,NULL,'edit',155,156), +(80,68,NULL,NULL,'changegroupset',157,158), +(81,68,NULL,NULL,'export',159,160), +(82,68,NULL,NULL,'add',161,162), +(83,68,NULL,NULL,'view',163,164), +(84,2,NULL,NULL,'Upgrade',166,179), +(85,84,NULL,NULL,'index',167,168), +(86,84,NULL,NULL,'step2',169,170), +(87,84,NULL,NULL,'add',171,172), +(88,84,NULL,NULL,'edit',173,174), +(89,84,NULL,NULL,'view',175,176), +(90,84,NULL,NULL,'delete',177,178), +(91,2,NULL,NULL,'Evaluations',180,219), +(92,91,NULL,NULL,'setUpAjaxList',181,182), +(93,91,NULL,NULL,'ajaxList',183,184), +(94,91,NULL,NULL,'view',185,186), +(95,91,NULL,NULL,'index',187,188), +(96,91,NULL,NULL,'export',189,190), +(97,91,NULL,NULL,'makeEvaluation',191,192), +(98,91,NULL,NULL,'completeEvaluationRubric',193,194), +(99,91,NULL,NULL,'viewEvaluationResults',195,196), +(100,91,NULL,NULL,'studentViewEvaluationResult',197,198), +(101,91,NULL,NULL,'markEventReviewed',199,200), +(102,91,NULL,NULL,'markGradeRelease',201,202), +(103,91,NULL,NULL,'markCommentRelease',203,204), +(104,91,NULL,NULL,'changeAllCommentRelease',205,206), +(105,91,NULL,NULL,'changeAllGradeRelease',207,208), +(106,91,NULL,NULL,'viewGroupSubmissionDetails',209,210), +(107,91,NULL,NULL,'viewSurveySummary',211,212), +(108,91,NULL,NULL,'add',213,214), +(109,91,NULL,NULL,'edit',215,216), +(110,91,NULL,NULL,'delete',217,218), +(111,2,NULL,NULL,'Oauthtokens',220,231), +(112,111,NULL,NULL,'index',221,222), +(113,111,NULL,NULL,'add',223,224), +(114,111,NULL,NULL,'edit',225,226), +(115,111,NULL,NULL,'delete',227,228), +(116,111,NULL,NULL,'view',229,230), +(117,2,NULL,NULL,'Evaltools',232,243), +(118,117,NULL,NULL,'index',233,234), +(119,117,NULL,NULL,'add',235,236), +(120,117,NULL,NULL,'edit',237,238), +(121,117,NULL,NULL,'view',239,240), +(122,117,NULL,NULL,'delete',241,242), +(123,2,NULL,NULL,'Penalty',244,257), +(124,123,NULL,NULL,'save',245,246), +(125,123,NULL,NULL,'add',247,248), +(126,123,NULL,NULL,'edit',249,250), +(127,123,NULL,NULL,'index',251,252), +(128,123,NULL,NULL,'view',253,254), +(129,123,NULL,NULL,'delete',255,256), +(130,2,NULL,NULL,'Groups',258,277), +(131,130,NULL,NULL,'setUpAjaxList',259,260), +(132,130,NULL,NULL,'index',261,262), +(133,130,NULL,NULL,'ajaxList',263,264), +(134,130,NULL,NULL,'view',265,266), +(135,130,NULL,NULL,'add',267,268), +(136,130,NULL,NULL,'edit',269,270), +(137,130,NULL,NULL,'delete',271,272), +(138,130,NULL,NULL,'import',273,274), +(139,130,NULL,NULL,'export',275,276), +(140,2,NULL,NULL,'Faculties',278,289), +(141,140,NULL,NULL,'index',279,280), +(142,140,NULL,NULL,'view',281,282), +(143,140,NULL,NULL,'add',283,284), +(144,140,NULL,NULL,'edit',285,286), +(145,140,NULL,NULL,'delete',287,288), +(146,2,NULL,NULL,'Rubrics',290,309), +(147,146,NULL,NULL,'postProcess',291,292), +(148,146,NULL,NULL,'setUpAjaxList',293,294), +(149,146,NULL,NULL,'index',295,296), +(150,146,NULL,NULL,'ajaxList',297,298), +(151,146,NULL,NULL,'view',299,300), +(152,146,NULL,NULL,'add',301,302), +(153,146,NULL,NULL,'edit',303,304), +(154,146,NULL,NULL,'copy',305,306), +(155,146,NULL,NULL,'delete',307,308), +(156,2,NULL,NULL,'Events',310,337), +(157,156,NULL,NULL,'postProcessData',311,312), +(158,156,NULL,NULL,'setUpAjaxList',313,314), +(159,156,NULL,NULL,'index',315,316), +(160,156,NULL,NULL,'ajaxList',317,318), +(161,156,NULL,NULL,'view',319,320), +(162,156,NULL,NULL,'add',321,322), +(163,156,NULL,NULL,'setSchedule',323,324), +(164,156,NULL,NULL,'getGroupMembers',325,326), +(165,156,NULL,NULL,'edit',327,328), +(166,156,NULL,NULL,'checkIfChanged',329,330), +(167,156,NULL,NULL,'calculateFrequency',331,332), +(168,156,NULL,NULL,'delete',333,334), +(169,156,NULL,NULL,'checkDuplicateName',335,336), +(170,2,NULL,NULL,'Simpleevaluations',338,357), +(171,170,NULL,NULL,'postProcess',339,340), +(172,170,NULL,NULL,'setUpAjaxList',341,342), +(173,170,NULL,NULL,'index',343,344), +(174,170,NULL,NULL,'ajaxList',345,346), +(175,170,NULL,NULL,'view',347,348), +(176,170,NULL,NULL,'add',349,350), +(177,170,NULL,NULL,'edit',351,352), +(178,170,NULL,NULL,'copy',353,354), +(179,170,NULL,NULL,'delete',355,356), +(180,2,NULL,NULL,'V1',358,393), +(181,180,NULL,NULL,'oauth',359,360), +(182,180,NULL,NULL,'oauth_error',361,362), +(183,180,NULL,NULL,'users',363,364), +(184,180,NULL,NULL,'courses',365,366), +(185,180,NULL,NULL,'groups',367,368), +(186,180,NULL,NULL,'groupMembers',369,370), +(187,180,NULL,NULL,'events',371,372), +(188,180,NULL,NULL,'grades',373,374), +(189,180,NULL,NULL,'departments',375,376), +(190,180,NULL,NULL,'courseDepartments',377,378), +(191,180,NULL,NULL,'userEvents',379,380), +(192,180,NULL,NULL,'enrolment',381,382), +(193,180,NULL,NULL,'add',383,384), +(194,180,NULL,NULL,'edit',385,386), +(195,180,NULL,NULL,'index',387,388), +(196,180,NULL,NULL,'view',389,390), +(197,180,NULL,NULL,'delete',391,392), +(198,2,NULL,NULL,'Departments',394,405), +(199,198,NULL,NULL,'index',395,396), +(200,198,NULL,NULL,'view',397,398), +(201,198,NULL,NULL,'add',399,400), +(202,198,NULL,NULL,'edit',401,402), +(203,198,NULL,NULL,'delete',403,404), +(204,2,NULL,NULL,'Sysparameters',406,421), +(205,204,NULL,NULL,'setUpAjaxList',407,408), +(206,204,NULL,NULL,'index',409,410), +(207,204,NULL,NULL,'ajaxList',411,412), +(208,204,NULL,NULL,'view',413,414), +(209,204,NULL,NULL,'add',415,416), +(210,204,NULL,NULL,'edit',417,418), +(211,204,NULL,NULL,'delete',419,420), +(212,2,NULL,NULL,'Mixevals',422,439), +(213,212,NULL,NULL,'setUpAjaxList',423,424), +(214,212,NULL,NULL,'index',425,426), +(215,212,NULL,NULL,'ajaxList',427,428), +(216,212,NULL,NULL,'view',429,430), +(217,212,NULL,NULL,'add',431,432), +(218,212,NULL,NULL,'edit',433,434), +(219,212,NULL,NULL,'copy',435,436), +(220,212,NULL,NULL,'delete',437,438), +(221,2,NULL,NULL,'Emailtemplates',440,459), +(222,221,NULL,NULL,'setUpAjaxList',441,442), +(223,221,NULL,NULL,'ajaxList',443,444), +(224,221,NULL,NULL,'index',445,446), +(225,221,NULL,NULL,'add',447,448), +(226,221,NULL,NULL,'edit',449,450), +(227,221,NULL,NULL,'delete',451,452), +(228,221,NULL,NULL,'view',453,454), +(229,221,NULL,NULL,'displayTemplateContent',455,456), +(230,221,NULL,NULL,'displayTemplateSubject',457,458), +(231,2,NULL,NULL,'Install',460,481), +(232,231,NULL,NULL,'index',461,462), +(233,231,NULL,NULL,'install2',463,464), +(234,231,NULL,NULL,'install3',465,466), +(235,231,NULL,NULL,'install4',467,468), +(236,231,NULL,NULL,'install5',469,470), +(237,231,NULL,NULL,'gpl',471,472), +(238,231,NULL,NULL,'add',473,474), +(239,231,NULL,NULL,'edit',475,476), +(240,231,NULL,NULL,'view',477,478), +(241,231,NULL,NULL,'delete',479,480), +(242,2,NULL,NULL,'Courses',482,505), +(243,242,NULL,NULL,'daysLate',483,484), +(244,242,NULL,NULL,'index',485,486), +(245,242,NULL,NULL,'ajaxList',487,488), +(246,242,NULL,NULL,'view',489,490), +(247,242,NULL,NULL,'home',491,492), +(248,242,NULL,NULL,'add',493,494), +(249,242,NULL,NULL,'edit',495,496), +(250,242,NULL,NULL,'delete',497,498), +(251,242,NULL,NULL,'move',499,500), +(252,242,NULL,NULL,'ajax_options',501,502), +(253,242,NULL,NULL,'import',503,504), +(254,2,NULL,NULL,'Surveys',506,535), +(255,254,NULL,NULL,'setUpAjaxList',507,508), +(256,254,NULL,NULL,'index',509,510), +(257,254,NULL,NULL,'ajaxList',511,512), +(258,254,NULL,NULL,'view',513,514), +(259,254,NULL,NULL,'add',515,516), +(260,254,NULL,NULL,'edit',517,518), +(261,254,NULL,NULL,'copy',519,520), +(262,254,NULL,NULL,'delete',521,522), +(263,254,NULL,NULL,'questionsSummary',523,524), +(264,254,NULL,NULL,'moveQuestion',525,526), +(265,254,NULL,NULL,'removeQuestion',527,528), +(266,254,NULL,NULL,'addQuestion',529,530), +(267,254,NULL,NULL,'editQuestion',531,532), +(268,254,NULL,NULL,'surveyAccess',533,534), +(269,2,NULL,NULL,'Lti',536,547), +(270,269,NULL,NULL,'index',537,538), +(271,269,NULL,NULL,'add',539,540), +(272,269,NULL,NULL,'edit',541,542), +(273,269,NULL,NULL,'view',543,544), +(274,269,NULL,NULL,'delete',545,546), +(275,2,NULL,NULL,'Emailer',548,575), +(276,275,NULL,NULL,'setUpAjaxList',549,550), +(277,275,NULL,NULL,'ajaxList',551,552), +(278,275,NULL,NULL,'index',553,554), +(279,275,NULL,NULL,'write',555,556), +(280,275,NULL,NULL,'cancel',557,558), +(281,275,NULL,NULL,'view',559,560), +(282,275,NULL,NULL,'addRecipient',561,562), +(283,275,NULL,NULL,'deleteRecipient',563,564), +(284,275,NULL,NULL,'getRecipient',565,566), +(285,275,NULL,NULL,'searchByUserId',567,568), +(286,275,NULL,NULL,'add',569,570), +(287,275,NULL,NULL,'edit',571,572), +(288,275,NULL,NULL,'delete',573,574), +(289,2,NULL,NULL,'Guard',576,593), +(290,289,NULL,NULL,'Guard',577,592), +(291,290,NULL,NULL,'login',578,579), +(292,290,NULL,NULL,'logout',580,581), +(293,290,NULL,NULL,'add',582,583), +(294,290,NULL,NULL,'edit',584,585), +(295,290,NULL,NULL,'index',586,587), +(296,290,NULL,NULL,'view',588,589), +(297,290,NULL,NULL,'delete',590,591), +(298,NULL,NULL,NULL,'functions',595,658), +(299,298,NULL,NULL,'user',596,623), +(300,299,NULL,NULL,'superadmin',597,598), +(301,299,NULL,NULL,'admin',599,600), +(302,299,NULL,NULL,'instructor',601,602), +(303,299,NULL,NULL,'tutor',603,604), +(304,299,NULL,NULL,'student',605,606), +(305,299,NULL,NULL,'import',607,608), +(306,299,NULL,NULL,'password_reset',609,620), +(307,306,NULL,NULL,'superadmin',610,611), +(308,306,NULL,NULL,'admin',612,613), +(309,306,NULL,NULL,'instructor',614,615), +(310,306,NULL,NULL,'tutor',616,617), +(311,306,NULL,NULL,'student',618,619), +(312,299,NULL,NULL,'index',621,622), +(313,298,NULL,NULL,'role',624,635), +(314,313,NULL,NULL,'superadmin',625,626), +(315,313,NULL,NULL,'admin',627,628), +(316,313,NULL,NULL,'instructor',629,630), +(317,313,NULL,NULL,'tutor',631,632), +(318,313,NULL,NULL,'student',633,634), +(319,298,NULL,NULL,'evaluation',636,637), +(320,298,NULL,NULL,'email',638,645), +(321,320,NULL,NULL,'allUsers',639,640), +(322,320,NULL,NULL,'allGroups',641,642), +(323,320,NULL,NULL,'allCourses',643,644), +(324,298,NULL,NULL,'emailtemplate',646,647), +(325,298,NULL,NULL,'viewstudentresults',648,649), +(326,298,NULL,NULL,'viewemailaddresses',650,651), +(327,298,NULL,NULL,'superadmin',652,653), +(328,298,NULL,NULL,'coursemanager',654,655), +(329,298,NULL,NULL,'viewusername',656,657); -- -------------------------------------------------------- @@ -426,122 +427,123 @@ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; INSERT INTO aros_acos (id, aro_id, aco_id, _create, _read, _update, _delete) VALUES -(1, 1, 2, '1', '1', '1', '1'), -(2, 1, 297, '1', '1', '1', '1'), -(3, 1, 1, '1', '1', '1', '1'), -(4, 2, 2, '-1', '-1', '-1', '-1'), -(5, 2, 122, '1', '1', '1', '1'), -(6, 2, 16, '1', '1', '1', '1'), -(7, 2, 28, '1', '1', '1', '1'), -(8, 2, 31, '-1', '-1', '-1', '-1'), -(9, 2, 30, '-1', '-1', '-1', '-1'), -(10, 2, 33, '-1', '-1', '-1', '-1'), -(11, 2, 32, '-1', '-1', '-1', '-1'), -(12, 2, 29, '-1', '-1', '-1', '-1'), -(13, 2, 34, '1', '1', '1', '1'), -(14, 2, 48, '1', '1', '1', '1'), -(15, 2, 58, '1', '1', '1', '1'), -(16, 2, 64, '1', '1', '1', '1'), -(17, 2, 84, '1', '1', '1', '1'), -(18, 2, 112, '1', '1', '1', '1'), -(19, 2, 145, '1', '1', '1', '1'), -(20, 2, 173, '1', '1', '1', '1'), -(21, 2, 197, '1', '1', '1', '1'), -(22, 2, 223, '1', '1', '1', '1'), -(23, 2, 207, '1', '1', '1', '1'), -(24, 2, 253, '1', '1', '1', '1'), -(25, 2, 291, '1', '1', '1', '1'), -(26, 2, 297, '-1', '-1', '-1', '-1'), -(27, 2, 323, '1', '1', '1', '1'), -(28, 2, 318, '1', '1', '1', '1'), -(29, 2, 320, '1', '1', '1', '1'), -(30, 2, 298, '1', '1', '1', '1'), -(31, 2, 300, '1', '1', '1', '-1'), -(32, 2, 299, '-1', '-1', '-1', '-1'), -(33, 2, 325, '1', '1', '1', '1'), -(34, 2, 328, '1', '1', '1', '1'), -(35, 2, 327, '1', '1', '1', '1'), -(36, 2, 326, '-1', '-1', '-1', '-1'), -(37, 3, 2, '-1', '-1', '-1', '-1'), -(38, 3, 122, '1', '1', '1', '1'), -(39, 3, 16, '1', '1', '1', '1'), -(40, 3, 34, '1', '1', '1', '1'), -(41, 3, 48, '1', '1', '1', '1'), -(42, 3, 58, '1', '1', '1', '1'), -(43, 3, 64, '1', '1', '1', '1'), -(44, 3, 84, '1', '1', '1', '1'), -(45, 3, 112, '1', '1', '1', '1'), -(46, 3, 145, '1', '1', '1', '1'), -(47, 3, 173, '1', '1', '1', '1'), -(48, 3, 197, '1', '1', '1', '1'), -(49, 3, 223, '1', '1', '1', '1'), -(50, 3, 207, '1', '1', '1', '1'), -(51, 3, 253, '1', '1', '1', '1'), -(52, 3, 291, '1', '1', '1', '1'), -(53, 3, 156, '1', '1', '1', '1'), -(54, 3, 158, '1', '1', '1', '1'), -(55, 3, 162, '1', '1', '1', '1'), -(56, 3, 164, '1', '1', '1', '1'), -(57, 3, 267, '-1', '-1', '-1', '-1'), -(58, 3, 297, '-1', '-1', '-1', '-1'), -(59, 3, 318, '1', '1', '-1', '-1'), -(60, 3, 298, '1', '1', '1', '1'), -(61, 3, 300, '-1', '-1', '-1', '-1'), -(62, 3, 299, '-1', '-1', '-1', '-1'), -(63, 3, 301, '-1', '1', '-1', '-1'), -(64, 3, 311, '-1', '-1', '-1', '-1'), -(65, 3, 325, '-1', '-1', '-1', '-1'), -(66, 3, 326, '-1', '-1', '-1', '-1'), -(67, 3, 327, '1', '1', '1', '1'), -(68, 4, 2, '-1', '-1', '-1', '-1'), -(69, 4, 122, '1', '1', '1', '1'), -(70, 4, 16, '-1', '-1', '-1', '-1'), -(71, 4, 34, '-1', '-1', '-1', '-1'), -(72, 4, 48, '-1', '-1', '-1', '-1'), -(73, 4, 58, '-1', '-1', '-1', '-1'), -(74, 4, 84, '-1', '-1', '-1', '-1'), -(75, 4, 112, '-1', '-1', '-1', '-1'), -(76, 4, 145, '-1', '-1', '-1', '-1'), -(77, 4, 173, '-1', '-1', '-1', '-1'), -(78, 4, 197, '-1', '-1', '-1', '-1'), -(79, 4, 223, '-1', '-1', '-1', '-1'), -(80, 4, 207, '-1', '-1', '-1', '-1'), -(81, 4, 253, '-1', '-1', '-1', '-1'), -(82, 4, 291, '1', '1', '1', '1'), -(83, 4, 70, '1', '1', '1', '1'), -(84, 4, 73, '1', '1', '1', '1'), -(85, 4, 71, '1', '1', '1', '1'), -(86, 4, 262, '1', '1', '1', '1'), -(87, 4, 297, '-1', '-1', '-1', '-1'), -(88, 4, 325, '-1', '-1', '-1', '-1'), -(89, 4, 326, '-1', '-1', '-1', '-1'), -(90, 5, 2, '-1', '-1', '-1', '-1'), -(91, 5, 122, '1', '1', '1', '1'), -(92, 5, 16, '-1', '-1', '-1', '-1'), -(93, 5, 34, '-1', '-1', '-1', '-1'), -(94, 5, 48, '-1', '-1', '-1', '-1'), -(95, 5, 58, '-1', '-1', '-1', '-1'), -(96, 5, 84, '-1', '-1', '-1', '-1'), -(97, 5, 112, '-1', '-1', '-1', '-1'), -(98, 5, 145, '-1', '-1', '-1', '-1'), -(99, 5, 173, '-1', '-1', '-1', '-1'), -(100, 5, 197, '-1', '-1', '-1', '-1'), -(101, 5, 223, '-1', '-1', '-1', '-1'), -(102, 5, 207, '-1', '-1', '-1', '-1'), -(103, 5, 253, '-1', '-1', '-1', '-1'), -(104, 5, 291, '1', '1', '1', '1'), -(105, 5, 70, '1', '1', '1', '1'), -(106, 5, 73, '1', '1', '1', '1'), -(107, 5, 71, '1', '1', '1', '1'), -(108, 5, 262, '1', '1', '1', '1'), -(109, 5, 156, '1', '1', '1', '1'), -(110, 5, 158, '1', '1', '1', '1'), -(111, 5, 162, '1', '1', '1', '1'), -(112, 5, 164, '1', '1', '1', '1'), -(113, 5, 297, '-1', '-1', '-1', '-1'), -(114, 5, 324, '1', '1', '1', '1'), -(115, 5, 325, '-1', '-1', '-1', '-1'), -(116, 5, 326, '-1', '-1', '-1', '-1'); +(1,1,2,'1','1','1','1'), +(2,1,298,'1','1','1','1'), +(3,1,1,'1','1','1','1'), +(4,2,2,'-1','-1','-1','-1'), +(5,2,56,'1','1','1','1'), +(6,2,242,'1','1','1','1'), +(7,2,198,'1','1','1','1'), +(8,2,201,'-1','-1','-1','-1'), +(9,2,200,'-1','-1','-1','-1'), +(10,2,203,'-1','-1','-1','-1'), +(11,2,202,'-1','-1','-1','-1'), +(12,2,199,'-1','-1','-1','-1'), +(13,2,275,'1','1','1','1'), +(14,2,221,'1','1','1','1'), +(15,2,117,'1','1','1','1'), +(16,2,91,'1','1','1','1'), +(17,2,156,'1','1','1','1'), +(18,2,130,'1','1','1','1'), +(19,2,212,'1','1','1','1'), +(20,2,146,'1','1','1','1'), +(21,2,170,'1','1','1','1'), +(22,2,254,'1','1','1','1'), +(23,2,68,'1','1','1','1'), +(24,2,24,'1','1','1','1'), +(25,2,292,'1','1','1','1'), +(26,2,298,'-1','-1','-1','-1'), +(27,2,324,'1','1','1','1'), +(28,2,319,'1','1','1','1'), +(29,2,321,'1','1','1','1'), +(30,2,299,'1','1','1','1'), +(31,2,301,'1','1','1','-1'), +(32,2,300,'-1','-1','-1','-1'), +(33,2,326,'1','1','1','1'), +(34,2,329,'1','1','1','1'), +(35,2,328,'1','1','1','1'), +(36,2,327,'-1','-1','-1','-1'), +(37,3,2,'-1','-1','-1','-1'), +(38,3,56,'1','1','1','1'), +(39,3,242,'1','1','1','1'), +(40,3,275,'1','1','1','1'), +(41,3,221,'1','1','1','1'), +(42,3,117,'1','1','1','1'), +(43,3,91,'1','1','1','1'), +(44,3,156,'1','1','1','1'), +(45,3,130,'1','1','1','1'), +(46,3,212,'1','1','1','1'), +(47,3,146,'1','1','1','1'), +(48,3,170,'1','1','1','1'), +(49,3,254,'1','1','1','1'), +(50,3,68,'1','1','1','1'), +(51,3,24,'1','1','1','1'), +(52,3,292,'1','1','1','1'), +(53,3,44,'1','1','1','1'), +(54,3,46,'1','1','1','1'), +(55,3,113,'1','1','1','1'), +(56,3,115,'1','1','1','1'), +(57,3,38,'-1','-1','-1','-1'), +(58,3,41,'1','1','1','1'), +(59,3,298,'-1','-1','-1','-1'), +(60,3,319,'1','1','-1','-1'), +(61,3,299,'1','1','1','1'), +(62,3,301,'-1','-1','-1','-1'), +(63,3,300,'-1','-1','-1','-1'), +(64,3,302,'-1','1','-1','-1'), +(65,3,312,'-1','-1','-1','-1'), +(66,3,326,'-1','-1','-1','-1'), +(67,3,327,'-1','-1','-1','-1'), +(68,3,328,'1','1','1','1'), +(69,4,2,'-1','-1','-1','-1'), +(70,4,56,'1','1','1','1'), +(71,4,242,'-1','-1','-1','-1'), +(72,4,275,'-1','-1','-1','-1'), +(73,4,221,'-1','-1','-1','-1'), +(74,4,117,'-1','-1','-1','-1'), +(75,4,156,'-1','-1','-1','-1'), +(76,4,130,'-1','-1','-1','-1'), +(77,4,212,'-1','-1','-1','-1'), +(78,4,146,'-1','-1','-1','-1'), +(79,4,170,'-1','-1','-1','-1'), +(80,4,254,'-1','-1','-1','-1'), +(81,4,68,'-1','-1','-1','-1'), +(82,4,24,'-1','-1','-1','-1'), +(83,4,292,'1','1','1','1'), +(84,4,97,'1','1','1','1'), +(85,4,100,'1','1','1','1'), +(86,4,98,'1','1','1','1'), +(87,4,33,'1','1','1','1'), +(88,4,298,'-1','-1','-1','-1'), +(89,4,326,'-1','-1','-1','-1'), +(90,4,327,'-1','-1','-1','-1'), +(91,5,2,'-1','-1','-1','-1'), +(92,5,56,'1','1','1','1'), +(93,5,242,'-1','-1','-1','-1'), +(94,5,275,'-1','-1','-1','-1'), +(95,5,221,'-1','-1','-1','-1'), +(96,5,117,'-1','-1','-1','-1'), +(97,5,156,'-1','-1','-1','-1'), +(98,5,130,'-1','-1','-1','-1'), +(99,5,212,'-1','-1','-1','-1'), +(100,5,146,'-1','-1','-1','-1'), +(101,5,170,'-1','-1','-1','-1'), +(102,5,254,'-1','-1','-1','-1'), +(103,5,68,'-1','-1','-1','-1'), +(104,5,24,'-1','-1','-1','-1'), +(105,5,292,'1','1','1','1'), +(106,5,97,'1','1','1','1'), +(107,5,100,'1','1','1','1'), +(108,5,98,'1','1','1','1'), +(109,5,33,'1','1','1','1'), +(110,5,44,'1','1','1','1'), +(111,5,46,'1','1','1','1'), +(112,5,113,'1','1','1','1'), +(113,5,115,'1','1','1','1'), +(114,5,298,'-1','-1','-1','-1'), +(115,5,325,'1','1','1','1'), +(116,5,326,'-1','-1','-1','-1'), +(117,5,327,'-1','-1','-1','-1'); -- -------------------------------------------------------- diff --git a/app/controllers/components/evaluation.php b/app/controllers/components/evaluation.php index ce7cf0f6d..a47350468 100644 --- a/app/controllers/components/evaluation.php +++ b/app/controllers/components/evaluation.php @@ -479,7 +479,7 @@ function formatSimpleEvaluationResult($event) * @access public * @return void */ - function loadRubricEvaluationDetail($event) + function loadRubricEvaluationDetail($event, $sutdentId = null) { $this->EvaluationRubric = new EvaluationRubric; $this->GroupsMembers = new GroupsMembers; @@ -489,7 +489,7 @@ function loadRubricEvaluationDetail($event) $Session = new SessionComponent(); $user = $Session->read('Auth.User');//User or Admin or - $evaluator = $user['id']; + $evaluator = empty($sutdentId) ? $user['id'] : $sutdentId; $result = array(); //Get Members for this evaluation $groupMembers = $this->User->getEventGroupMembersNoTutors( @@ -801,12 +801,12 @@ function changeRubricEvaluationCommentRelease ($groupEventId, $evaluateeId, $rel * @access public * @return void */ - function loadMixEvaluationDetail ($event) + function loadMixEvaluationDetail ($event, $studentId = null) { $this->EvaluationMixeval = ClassRegistry::init('EvaluationMixeval'); $this->User = ClassRegistry::init('User'); - $evaluator = $this->Auth->user('id'); + $evaluator = empty($studentId) ? $this->Auth->user('id') : $studentId; //Get Members for this evaluation $groupMembers = $this->User->getEventGroupMembersNoTutors( diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index 2987dc51e..9323da0e9 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -16,7 +16,7 @@ class EvaluationsController extends AppController public $uses = array('SurveyQuestion', 'GroupEvent', 'EvaluationRubric', 'EvaluationRubricDetail', 'EvaluationSubmission', 'Event', 'EvaluationSimple', - 'SimpleEvaluation', 'Rubric', 'Group', 'User', 'UserEnrol', + 'SimpleEvaluation', 'Rubric', 'Group', 'User', 'UserEnrol', 'UserCourse', 'GroupsMembers', 'RubricsLom', 'RubricsCriteria', 'RubricsCriteriaComment', 'Personalize', 'Penalty', 'Question', 'Response', 'Survey', 'SurveyInput', 'Course', @@ -335,7 +335,7 @@ function export($type, $id) * @access public * @return void */ - function makeEvaluation($eventId, $objectId = null) { + function makeEvaluation($eventId, $objectId = null, $studentId = null) { // invalid event ids if (!is_numeric($eventId) || null == ($event = $this->Event->getEventById($eventId))) { $this->Session->setFlash(__('Error: Invalid Id', true)); @@ -347,16 +347,16 @@ function makeEvaluation($eventId, $objectId = null) { $templateTypeId = $this->Event->field('event_template_type_id'); switch($templateTypeId) { case 1: - $this->_makeSimpleEvaluation($event, $objectId); + $this->_makeSimpleEvaluation($event, $objectId, $studentId); break; case 2: - $this->_makeRubricEvaluation($event, $objectId); + $this->_makeRubricEvaluation($event, $objectId, $studentId); break; case 3: - $this->_makeSurveyEvaluation($event); + $this->_makeSurveyEvaluation($event, $studentId); break; case 4: - $this->_makeMixevalEvaluation($event, $objectId); + $this->_makeMixevalEvaluation($event, $objectId, $studentId); break; } } @@ -389,17 +389,17 @@ function _sendConfirmationEmail() * @access public * @return void */ - function _makeSimpleEvaluation($event, $groupId) + function _makeSimpleEvaluation($event, $groupId, $studentId = null) { $this->autoRender = false; $eventId = $event['Event']['id']; if (empty($this->params['data'])) { $userId = User::get('id'); - $grpMem = $this->GroupsMembers->find('first', array( - 'conditions' => array('GroupsMembers.user_id' => $userId, - 'GroupsMembers.group_id' => $groupId) - )); + + $grpMem = $this->GroupsMembers->find('first', array( + 'conditions' => array('GroupsMembers.user_id' => empty($studentId) ? $userId : $studentId, + 'GroupsMembers.group_id' => $groupId))); // filter out users that don't have access to this eval, invalid ids if (empty($grpMem)) { @@ -418,10 +418,10 @@ function _makeSimpleEvaluation($event, $groupId) } // students can submit again - $submission = $this->EvaluationSubmission->getEvalSubmissionByEventIdGroupIdSubmitter($eventId, $groupId, User::get('id')); + $submission = $this->EvaluationSubmission->getEvalSubmissionByEventIdGroupIdSubmitter($eventId, $groupId, empty($studentId) ? User::get('id') : $studentId); if (!empty($submission)) { // load the submitted values - $evaluation = $this->EvaluationSimple->getSubmittedResultsByGroupIdEventIdAndEvaluator($groupId, $eventId, User::get('id')); + $evaluation = $this->EvaluationSimple->getSubmittedResultsByGroupIdEventIdAndEvaluator($groupId, $eventId, empty($studentId) ? User::get('id') : $studentId); foreach ($evaluation as $eval) { $this->data['Evaluation']['point'.$eval['EvaluationSimple']['evaluatee']] = $eval['EvaluationSimple']['score']; $this->data['Evaluation']['comment_'.$eval['EvaluationSimple']['evaluatee']] = $eval['EvaluationSimple']['comment']; @@ -448,12 +448,12 @@ function _makeSimpleEvaluation($event, $groupId) $this->set('title_for_layout', $this->Course->getCourseName($courseId, 'S').__(' > Evaluate Peers', true)); //Set userId, first_name, last_name - $this->set('userId', $userId); + $this->set('userId', empty($studentId) ? $userId : $studentId); $this->set('fullName', $this->Auth->user('full_name')); //Get Members for this evaluation - $groupMembers = $this->User->getEventGroupMembersNoTutors($groupId, $event['Event']['self_eval'], $userId); + $groupMembers = $this->User->getEventGroupMembersNoTutors($groupId, $event['Event']['self_eval'], empty($studentId) ? $userId : $studentId); $this->set('groupMembers', $groupMembers); // enough points to distribute amongst number of members - 1 (evaluator does not evaluate him or herself) @@ -526,16 +526,23 @@ function _makeSimpleEvaluation($event, $groupId) * @access public * @return void */ - function _makeSurveyEvaluation ($event) + function _makeSurveyEvaluation ($event, $studentId = null) { //TODO Move validation to parent, since it's shared among all $surveyId = $event['Event']['template_id']; $eventId = $event['Event']['id']; $userId = $this->Auth->user('id'); $courseId = $event['Event']['course_id']; - // Make sure user is a student in this course - $ret = $this->UserEnrol->field('id', - array('course_id' => $courseId, 'user_id' => $userId )); + if (empty($studentId)) { + // Make sure user is a student in this course + $ret = $this->UserEnrol->field('id', + array('course_id' => $courseId, 'user_id' => $userId )); + } + else { + // Make sure user is an instructor in this course + $ret = $this->UserCourse->field('id', + array('course_id' => $courseId, 'user_id' => $userId )); + } if (!$ret) { $this->Session->setFlash(_('Error: Invalid Id')); $this->redirect('/home/index'); @@ -563,7 +570,7 @@ function _makeSurveyEvaluation ($event) // Process form submit if (!empty($this->data)) { // We need an evaluation submission entry - $sub['EvaluationSubmission']['submitter_id'] = $userId; + $sub['EvaluationSubmission']['submitter_id'] = empty($studentId) ? $userId : $studentId; $sub['EvaluationSubmission']['submitted'] = 1; $sub['EvaluationSubmission']['date_submitted'] = date('Y-m-d H:i:s'); @@ -623,6 +630,7 @@ function _makeSurveyEvaluation ($event) $this->set('questions', $this->Survey->getQuestions($surveyId)); $this->set('event', $this->Event->findById($eventId)); $this->set('userId', $userId); + $this->set('studentId', $studentId); $this->set('eventId', $event['Event']['id']); $this->render('survey_eval_form'); } @@ -636,7 +644,7 @@ function _makeSurveyEvaluation ($event) * @access public * @return void */ - function _makeRubricEvaluation ($event, $groupId) + function _makeRubricEvaluation ($event, $groupId, $studentId = null) { $this->autoRender = false; $eventId = $event['Event']['id']; @@ -651,7 +659,7 @@ function _makeRubricEvaluation ($event, $groupId) // if group id provided does not match the group id the user belongs to or // template type is not rubric - they are redirected if (!is_numeric($groupId) || !in_array($groupId, $groups) || - !$this->GroupsMembers->checkMembershipInGroup($groupId, User::get('id'))) { + !$this->GroupsMembers->checkMembershipInGroup($groupId, empty($studentId) ? User::get('id') : $studentId)) { $this->Session->setFlash(__('Error: Invalid Id', true)); $this->redirect('/home/index'); return; @@ -688,7 +696,7 @@ function _makeRubricEvaluation ($event, $groupId) $this->set('viewData', $rubricEvalViewData); $this->set('title_for_layout', $this->Course->getCourseName($courseId, 'S').__(' > Evaluate Peers', true)); - $rubricDetail = $this->Evaluation->loadRubricEvaluationDetail($event); + $rubricDetail = $this->Evaluation->loadRubricEvaluationDetail($event, $studentId); $this->set('groupMembers', $rubricDetail['groupMembers']); $this->set('userIds', implode(',', Set::extract('/User/id', $rubricDetail['groupMembers']))); $this->set('evaluateeCount', $rubricDetail['evaluateeCount']); @@ -717,7 +725,9 @@ function _makeRubricEvaluation ($event, $groupId) $this->set('allDone', $allDone); $this->set('comReq', $comReq); - + if (!empty($studentId)) { + $this->set('studentId', $studentId); + } $this->render('rubric_eval_form'); } else { $eventId = $this->params['form']['event_id']; @@ -753,7 +763,8 @@ function _makeRubricEvaluation ($event, $groupId) } $suffix = empty($msg) ? '.' : ', but '.implode(' and ', $msg).'.'; $this->Session->setFlash(__('Your evaluation has been saved'.$suffix, true)); - $this->redirect('/evaluations/makeEvaluation/'.$eventId.'/'.$groupId); + + $this->redirect('/evaluations/makeEvaluation/'.$eventId.'/'.$groupId.'/'.$studentId); return; } else { //Found error @@ -798,7 +809,11 @@ function completeEvaluationRubric () $evaluator = $this->params['data']['Evaluation']['evaluator_id']; $evaluators = $this->GroupsMembers->findAllByGroupId($groupId); $evaluators = Set::extract('/GroupsMembers/user_id', $evaluators); - + + $studentId = $this->params['form']['student_id']; + if (!empty($studentId)) { + $evaluator = $studentId; + } $groupEventId = $this->params['form']['group_event_id']; //Get the target group event $groupEvent = $this->GroupEvent->getGroupEventByEventIdGroupId($eventId, $groupId); @@ -857,7 +872,7 @@ function completeEvaluationRubric () * @access public * @return void */ - function _makeMixevalEvaluation ($event, $groupId) + function _makeMixevalEvaluation ($event, $groupId, $studentId = null) { $this->autoRender = false; $eventId = $event['Event']['id']; @@ -875,7 +890,7 @@ function _makeMixevalEvaluation ($event, $groupId) $group = array(); $group_events = $this->GroupEvent->getGroupEventByEventId($eventId); - $userId = User::get('id'); + $userId = empty($studentId) ? User::get('id') : $studentId; foreach ($group_events as $events) { if ($this->GroupsMembers->checkMembershipInGroup($events['GroupEvent']['group_id'], $userId) !== 0) { $group[] = $events['GroupEvent']['group_id']; @@ -900,14 +915,14 @@ function _makeMixevalEvaluation ($event, $groupId) return; } - $sub = $this->EvaluationSubmission->getEvalSubmissionByEventIdSubmitter($eventId, User::get('id')); + $sub = $this->EvaluationSubmission->getEvalSubmissionByEventIdSubmitter($eventId, $userId); $members = $this->GroupsMembers->findAllByGroupId($groupId); $penalty = $this->Penalty->getPenaltyByEventId($eventId); $penaltyDays = $this->Penalty->getPenaltyDays($eventId); $penaltyFinal = $this->Penalty->getPenaltyFinal($eventId); $enrol = $this->UserEnrol->find('count', array( - 'conditions' => array('user_id' => User::get('id'), 'course_id' => $courseId) + 'conditions' => array('user_id' => $userId, 'course_id' => $courseId) )); $this->set('penaltyFinal', $penaltyFinal); $this->set('penaltyDays', $penaltyDays); @@ -918,9 +933,9 @@ function _makeMixevalEvaluation ($event, $groupId) //Setup the courseId to session $this->set('courseId', $event['Event']['course_id']); $this->set('title_for_layout', $this->Course->getCourseName($courseId, 'S').__(' > Evaluate Peers', true)); - $this->set('groupMembers', $this->Evaluation->loadMixEvaluationDetail($event)); + $this->set('groupMembers', $this->Evaluation->loadMixEvaluationDetail($event, $studentId)); $self = $this->EvaluationMixeval->find('first', array( - 'conditions' => array('evaluator' => User::get('id'), 'evaluatee' => User::get('id'), 'event_id' => $eventId) + 'conditions' => array('evaluator' => $userId, 'evaluatee' => $userId, 'event_id' => $eventId) )); $this->set('self', $self); $questions = $this->MixevalQuestion->findAllByMixevalId($event['Event']['template_id']); @@ -929,6 +944,10 @@ function _makeMixevalEvaluation ($event, $groupId) $this->set('questions', $questions); $this->set('mixeval', $mixeval); $this->set('enrol', $enrol); + + if (!empty($studentId)) { + $this->set('studentId', $studentId); + } $this->render('mixeval_eval_form'); } else { @@ -936,7 +955,7 @@ function _makeMixevalEvaluation ($event, $groupId) unset($this->data['data']); $mixeval = $this->Mixeval->findById($data['template_id']); $groupEventId = $data['grp_event_id']; - $evaluator = $data['submitter_id']; + $evaluator = empty($studentId) ? $data['submitter_id'] : $studentId; $required = true; $failures = array(); @@ -946,6 +965,9 @@ function _makeMixevalEvaluation ($event, $groupId) if (!isset($eval['Evaluation'])) { continue; // only has self-evaluation so skip } + if (!empty($studentId)) { + $eval['Evaluation']['evaluator_id'] = $studentId; + } $eventId = $eval['Evaluation']['event_id']; $groupId = $eval['Evaluation']['group_id']; $evaluatee = $eval['Evaluation']['evaluatee_id']; @@ -970,7 +992,7 @@ function _makeMixevalEvaluation ($event, $groupId) // check self evaluation questions // second condition to exclude tutors if ($mixeval['Mixeval']['self_eval'] > 0 && isset($this->data[$evaluator]['Self-Evaluation'])) { - $evaluatee = User::get('id'); + $evaluatee = empty($studentId) ? User::get('id') : $studentId; $eventId = $this->data[$evaluatee]['Self-Evaluation']['event_id']; $groupId = $this->data[$evaluatee]['Self-Evaluation']['group_id']; $this->data[$evaluatee]['Evaluation'] = $this->data[$evaluatee]['Self-Evaluation']; @@ -995,7 +1017,7 @@ function _makeMixevalEvaluation ($event, $groupId) $this->EvaluationSubmission->id = null; $evaluationSubmission['EvaluationSubmission']['grp_event_id'] = $groupEventId; $evaluationSubmission['EvaluationSubmission']['event_id'] = $eventId; - $evaluationSubmission['EvaluationSubmission']['submitter_id'] = $evaluator; + $evaluationSubmission['EvaluationSubmission']['submitter_id'] = empty($studentId) ? $evaluator : $studentId; $evaluationSubmission['EvaluationSubmission']['date_submitted'] = date('Y-m-d H:i:s'); $evaluationSubmission['EvaluationSubmission']['submitted'] = 1; if (!$this->EvaluationSubmission->save($evaluationSubmission)) { @@ -1228,7 +1250,7 @@ function viewEvaluationResults($eventId, $groupId = null, $displayFormat="") * @access public * @return void */ - function studentViewEvaluationResult($eventId, $groupId = null) + function studentViewEvaluationResult($eventId, $groupId = null, $studentId = null) { $this->autoRender = false; @@ -1315,7 +1337,7 @@ function studentViewEvaluationResult($eventId, $groupId = null) break; case 3: //View Survey Result $answers = array(); - $formattedResult = $this->Evaluation->formatSurveyEvaluationResult($event, User::get('id')); + $formattedResult = $this->Evaluation->formatSurveyEvaluationResult($event, empty($studentId) ? User::get('id') : $studentId); foreach ($formattedResult['answers'] as $answer) { $answers[$answer['SurveyInput']['question_id']][] = $answer; diff --git a/app/controllers/users_controller.php b/app/controllers/users_controller.php index 88dbe9bf9..ba40a2215 100644 --- a/app/controllers/users_controller.php +++ b/app/controllers/users_controller.php @@ -700,7 +700,6 @@ public function edit($userId = null, $courseId = null) { } else { $enrolments = array('Enrolment' => array()); } - $test = $this->data['Courses']; $this->data = array_merge($this->data, $enrolments); // Now we actually attempt to save the data @@ -1561,4 +1560,179 @@ private function _notUnenrolCourses($editor, $userId) return array_diff($userCourses, array_keys($editorCourses)); } + + /** + * formatDueIn + * + * Take the due interval, which is in seconds, and format + * it something that's easier for users to read. + * + * @param mixed $seconds seconds + * + * @access private + * @return void + */ + private function _formatDueIn($seconds) + { + $ret = ""; + if ($seconds > 86400) { + $ret = round($seconds / 86400, 1) . __(' days', true); + } + elseif ($seconds < 3600) { + $minutes = (int) ($seconds / 60); + $seconds = $seconds % 60; + $ret = $minutes . __(' minutes ', true) . $seconds + . __(' seconds', true); + } + else { + $hours = (int) ($seconds / 3600); + $minutes = (int) ($seconds % 3600 / 60); + $ret = $hours . __(' hours ', true) . $minutes . + __(' minutes', true); + } + return $ret; + } + + /** + * Helper to filter events into 3 different categories and to + * discard inactive events. + * + * The 3 categories are: Upcoming, Submitted, Expired + * + * - Upcoming are events that the user can still make submissions for. + * - Submitted are events that the user has already made a submission. + * - Expired are events that the user hasn't made and can no longer make + * submissions, but they can still view results from their peers. + * + * An evaluation is considered inactive once past its result release + * period. A survey is considered inactive once past its release period. + * + * @param array $events - list of events info returned from the event model, + * each event MUST have an 'EvaluationSubmission' array or this won't work + * + * @return Discard inactive events and then split the remaining events + * into upcoming, submitted, and expired. + * */ + private function _splitSubmittedEvents($events) + { + $submitted = $upcoming = $expired = array(); + foreach ($events as $event) { + if (empty($event['EvaluationSubmission']) && + $event['Event']['is_released'] + ) { // can only take surveys during the release period + $upcoming[] = $event; + } + else if (!empty($event['EvaluationSubmission']) && + strtotime('NOW') < + strtotime($event['Event']['result_release_date_end']) + ) { // has submission and can or will be able to view results soon + // note that we're not using is_released or is_result_released + // because of an edge case where if there is a period of time + // between the release and result release period, the evaluation + // will disappear from view + $submitted[] = $event; + } + else if (!empty($event['EvaluationSubmission']) && + $event['Event']['is_released'] + ) { + // special case for surveys, which doesn't have + // result_release_date_end + $submitted[] = $event; + } + else if (empty($event['EvaluationSubmission']) && + strtotime('NOW') < + strtotime($event['Event']['result_release_date_end']) && + strtotime('NOW') > + strtotime($event['Event']['release_date_end']) + ) { // student did not do the survey within the allowed time + // but we should still let them view results + $expired[] = $event; + } + } + return array('upcoming' => $upcoming, + 'submitted' => $submitted, + 'expired' => $expired + ); + } + + /** + * showEvents + * + * @param mixed $id - user id + * + * @access public + * @return void + */ + function showEvents($id) + { + // check what type the logged in user is + if(User::hasPermission('functions/superadmin')) { + $extraId = null; + } + else if (User::hasPermission('controllers/departments')) { + $extraId = User::getAccessibleCourses(); + } + else { + $extraId = User::get('id'); + } + // find all the student's events the user is allowed to see + $events = $this->Event->getEventsByUserId($id, null, $extraId); + + // mark events as late if past due date + foreach ($events as &$type) { + foreach ($type as &$event) { + if ($event['Event']['due_in'] > 0) { + $event['late'] = false; + continue; + } + $event['late'] = true; + } + } + + // determine the proper penalty to be applied to a late eval + foreach ($events['Evaluations'] as &$event) { + if (!$event['late'] || empty($event['Penalty'])) { + continue; + } + // convert seconds to days + $daysLate = abs($event['Event']['due_in']) / 86400; + $pctPenalty = 0; + foreach ($event['Penalty'] as $penalty) { + $pctPenalty = $penalty['percent_penalty']; + if ($penalty['days_late'] > $daysLate) { + break; + } + } + $event['percent_penalty'] = $pctPenalty; + } + + // format the 'due in' time interval for display + foreach ($events as &$types) { + foreach ($types as &$event) { + $event['Event']['due_in'] = $this->_formatDueIn( + abs($event['Event']['due_in'])); + } + } + + // remove non-current events and split into upcoming/submitted/expired + $evals = $this->_splitSubmittedEvents($events['Evaluations']); + $surveys = $this->_splitSubmittedEvents($events['Surveys']); + + // calculate summary statistics + $numOverdue = 0; + $numDue = 0; + $numDue = sizeof($evals['upcoming']) + sizeof($surveys['upcoming']); + // only evals can have overdue events right now + foreach ($evals['upcoming'] as $e) { + $e['late'] ? $numOverdue++ : ''; + } + + + $this->set('studentId', $id); + $this->set('evals', $evals); + $this->set('surveys', $surveys); + $this->set('numOverdue', $numOverdue); + $this->set('numDue', $numDue); + $this->render('student_events'); + } } \ No newline at end of file diff --git a/app/models/event.php b/app/models/event.php index 8434dd29e..6ed0021ee 100644 --- a/app/models/event.php +++ b/app/models/event.php @@ -677,19 +677,42 @@ function getEventFieldsByEventId($eventId, $fields) * @access public * @return array array of events with related models, e.g. course, group, submission */ - function getEventsByUserId($userId, $fields = null) + function getEventsByUserId($userId, $fields = null, $extraId = null) { + ini_set('display_errors',1); + error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); $evaluationFields = $surveyFields = $fields; if ($evaluationFields != null) { $evaluationFields[] = 'GroupEvent.*'; } - // get the groups that this user is in - $groups = $this->Group->find('all', array( - 'fields' => 'id', - 'conditions' => array('Member.id' => $userId), - 'contain' => array('Member', 'GroupEvent.id'))); - $groupEventIds = Set::extract('/GroupEvent/id', $groups); - + if ($extraId) { + if (is_array($extraId)) { + $courseIds = array(); + foreach ($extraId as $course) { + $courseIds[] = $course; + } + } + else { + $courses = $this->Course->getCourseByInstructor($extraId); + $courseIds = array(); + foreach ($courses as $course) { + $courseIds[] = $course['Course']['id']; + } + } + $groups = $this->Group->find('all', array( + 'fields' => 'id', + 'conditions' => array('Member.id' => $userId, 'course_id' => $courseIds), + 'contain' => array('Member', 'GroupEvent.id'))); + $groupEventIds = Set::extract('/GroupEvent/id', $groups); + } + else { + // get the groups that this user is in + $groups = $this->Group->find('all', array( + 'fields' => 'id', + 'conditions' => array('Member.id' => $userId), + 'contain' => array('Member', 'GroupEvent.id'))); + $groupEventIds = Set::extract('/GroupEvent/id', $groups); + } // find evaluation events based on the groups this user is in $evaluationEvents = $this->find('all', array( 'fields' => $evaluationFields, @@ -729,15 +752,16 @@ function getEventsByUserId($userId, $fields = null) } } - // to find the surveys, we need to find the courses that user is enrolled in - // can't use find('list') as we are query the conditions on HABTM - $courses = $this->Course->find('all', array( - 'fields' => array('id'), - 'conditions' => array('Enrol.id' => $userId), - 'contain' => 'Enrol', - )); - $courseIds = Set::extract($courses, '/Course/id'); - + if (empty($courseIds)) { + // to find the surveys, we need to find the courses that user is enrolled in + // can't use find('list') as we are query the conditions on HABTM + $courses = $this->Course->find('all', array( + 'fields' => array('id'), + 'conditions' => array('Enrol.id' => $userId), + 'contain' => 'Enrol', + )); + $courseIds = Set::extract($courses, '/Course/id'); + } // find survey events based on the groups this user is in $surveyEvents = $this->find('all', array( 'fields' => $surveyFields, @@ -753,7 +777,6 @@ function getEventsByUserId($userId, $fields = null) ), ) )); - // some clean up for submission foreach ($surveyEvents as &$event) { if (isset($event['EvaluationSubmission'][0])) { diff --git a/app/vendors/shells/create_acl.php b/app/vendors/shells/create_acl.php index b93f37fad..c3ff8cb07 100644 --- a/app/vendors/shells/create_acl.php +++ b/app/vendors/shells/create_acl.php @@ -530,6 +530,7 @@ function createPermissions() $this->Acl->allow($role, 'controllers/Oauthtokens/add'); $this->Acl->allow($role, 'controllers/Oauthtokens/delete'); $this->Acl->deny($role, 'controllers/Users/merge'); + $this->Acl->allow($role, 'controllers/Users/showEvents'); $this->Acl->deny($role, 'functions'); $this->Acl->allow($role, 'functions/evaluation'); $this->Acl->deny($role, 'functions/evaluation', 'update'); diff --git a/app/views/evaluations/mixeval_eval_form.ctp b/app/views/evaluations/mixeval_eval_form.ctp index 6409757c2..b863938f1 100644 --- a/app/views/evaluations/mixeval_eval_form.ctp +++ b/app/views/evaluations/mixeval_eval_form.ctp @@ -33,7 +33,7 @@ Form->create('EvaluationMixeval', array( - 'url' => 'makeEvaluation/'.$event['Event']['id'].'/'.$event['Group']['id']));?> + 'url' => 'makeEvaluation/'.$event['Event']['id'].'/'.$event['Group']['id'].'/'.empty($studentId) ? '' : $studentId));?> "; ?> "; ?> "; ?> diff --git a/app/views/evaluations/rubric_eval_form.ctp b/app/views/evaluations/rubric_eval_form.ctp index d38933b8b..e1bf71742 100644 --- a/app/views/evaluations/rubric_eval_form.ctp +++ b/app/views/evaluations/rubric_eval_form.ctp @@ -25,7 +25,7 @@ function saveButtonVal(userId) { script('ricopanelcontainer')?> script('ricoaccordion')?> hidden('Evaluation/id'); ?> -
+ @@ -129,6 +129,7 @@ function saveButtonVal(userId) { + submit(__('Submit to Complete the Evaluation', true), array('div'=>'submitComplete')); diff --git a/app/views/evaluations/survey_eval_form.ctp b/app/views/evaluations/survey_eval_form.ctp index 82b0c5d30..6980f611e 100644 --- a/app/views/evaluations/survey_eval_form.ctp +++ b/app/views/evaluations/survey_eval_form.ctp @@ -5,8 +5,14 @@ if (!empty($event['Event']['description'])) { ?>
' . $event['Event']['title'] . ''; -echo $form->create('SurveyInput', - array('url' => "makeEvaluation/$eventId")); +if (empty($studentId)) { + echo $form->create('SurveyInput', + array('url' => "makeEvaluation/$eventId")); +} +else { + echo $form->create('SurveyInput', + array('url' => "makeEvaluation/$eventId/0/$studentId")); +} foreach ($questions as $i => $q) { echo $html->div('prompt', $i + 1 .' '. $q['Question']['prompt']); diff --git a/app/views/users/go_to_class_list.ctp b/app/views/users/go_to_class_list.ctp index 3b7a3a767..ee5248860 100644 --- a/app/views/users/go_to_class_list.ctp +++ b/app/views/users/go_to_class_list.ctp @@ -63,6 +63,15 @@ function fnFormatDetails ( oTable, nTr ) sOut += ''; sOut += '
Drop'; sOut += '
'; + + sOut += ''; + sOut += '
Show user\'s events'; + sOut += '
'; + + return sOut; } @@ -96,7 +105,7 @@ jQuery(document).ready(function() { * Note that the indicator for showing which row is open is not controlled by DataTables, * rather it is done here */ - jQuery('#table_id tbody td').on('click', function (ev) { + jQuery('#table_id tbody').on('click', 'td', function (ev) { if (elmnt) { elmnt.remove(); elmnt = null; diff --git a/app/views/users/student_events.ctp b/app/views/users/student_events.ctp new file mode 100644 index 000000000..19facd5f5 --- /dev/null +++ b/app/views/users/student_events.ctp @@ -0,0 +1,207 @@ +
+link($event['Event']['title'], + '/evaluations/makeEvaluation/'.$event['Event']['id'].'/'. + $event['Group']['id'].'/'.$studentId); + $tmp[] = $event['Group']['group_name']; + } + else { + $tmp[] = $html->link($event['Event']['title'], + '/evaluations/makeEvaluation/'.$event['Event']['id'].'/0/'.$studentId); + } + $tmp[] = $event['Course']['course']; + $tmp[] = Toolkit::formatDate($event['Event']['due_date']); + + $due = $event['Event']['due_in']; + if ($event['late']) { + $penalty = isset($event['percent_penalty']) ? + ', ' . $event['percent_penalty'] . '% penalty' : ''; + $tmp[] = "$due$penalty"; + } + else { + $tmp[] = $due; + } + + $ret[] = $tmp; + } + return $ret; +} + +$evalUpcoming = getUpcomingTableArray($html, $evals['upcoming'], $studentId); +$surveyUpcoming = getUpcomingTableArray($html, $surveys['upcoming'], $studentId); + +function getNonUpcomingTableArray($html, $events, $studentId) { + $ret = array(); + foreach ($events as $event) { + $tmp = array(); + if (isset($event['Event']['is_result_released']) && + $event['Event']['is_result_released'] + ) { // we're in the result release period, so link to the results + $tmp[] = $html->link($event['Event']['title'], + '/evaluations/studentViewEvaluationResult/' . + $event['Event']['id'] . '/' . $event['Group']['id'].'/'.$studentId); + $tmp[] = $event['Event']['result_release_date_end']; + } + else if ($event['Event']['event_template_type_id'] == 3) { + // this is a survey, no release period, so link to the results + $tmp[] = $html->link($event['Event']['title'], + '/evaluations/studentViewEvaluationResult/' . + $event['Event']['id'].'/0/'.$studentId); + } + else { + // we're not in the result release period, notify user when they can + // view the results + if ($event['Event']['is_released']) { + // can let students edit their submissions + if (isset($event['Group']['group_name'])) { + $tmp[] = $html->link($event['Event']['title'], + '/evaluations/makeEvaluation/'.$event['Event']['id']. + '/'. $event['Group']['id'].'/'.$studentId); + } + else { + $tmp[] = $html->link($event['Event']['title'], + '/evaluations/makeEvaluation/'.$event['Event']['id'].'/0/'.$studentId); + } + } + else { + $tmp[] = $event['Event']['title']; + } + $tmp[] = "" . + $event['Event']['result_release_date_begin'] . ""; + } + if (isset($event['Group']['group_name'])) { + // NOTE: surveys don't have group names + $tmp[] = $event['Group']['group_name']; + } + $tmp[] = $event['Course']['course']; + $tmp[] = Toolkit::formatDate($event['Event']['due_date']); + if (!empty($event['EvaluationSubmission'])) { + // expired events have no submissions + $tmp[] = $event['EvaluationSubmission']['date_submitted']; + } + $ret[] = $tmp; + } + return $ret; +} + +$evalSubmitted = getNonUpcomingTableArray($html, $evals['submitted'], $studentId); +$surveySubmitted = getNonUpcomingTableArray($html, $surveys['submitted'], $studentId); +$evalExpired = getNonUpcomingTableArray($html, $evals['expired'], $studentId); +// note that we have this section for completeness, but currently, +// surveys are removed once past the due date, so unless the student +// made a submission, it won't show up +$surveyExpired = getNonUpcomingTableArray($html, $surveys['expired'], $studentId); + +if ($numOverdue) { + echo "
$numOverdue Overdue Event(s)
"; +} +if ($numDue) { + echo "
$numDue Pending Event(s) Total
"; +} +else { + echo "
No Event(s) Pending
"; +} +?> + + +

Peer Evaluations

+

Due

+ + + + + + + + + tableCells($evalUpcoming); + ?> + + + +
EventGroupCourseDue DateDue In/Late By
No peer evaluations due at this time
+ +

Submitted

+ + + + + + + + + +tableCells($evalSubmitted); ?> + + + + + +
EventResult Available/EndGroupCourseDue DateDate Submitted
No submitted evaluations available.
+ + +

Expired With No Submission

+ + + + + + + + +tableCells($evalExpired); ?> +
EventResult Available/EndGroupCourseDue Date
+ + +

Surveys

+

Due

+ + + + + + + + tableCells($surveyUpcoming); + ?> + + + +
EventCourseDue DateDue In/Late By
No survey due at this time
+ +

Submitted

+ + + + + + + +tableCells($surveySubmitted); ?> + + + + + +
EventCourseDue DateDate Submitted
No submitted surveys available.
+ + +

Expired With No Submission

+ + + + + + +tableCells($surveyExpired); ?> +
EventCourseDue Date
+ + +
From 9df05d36ce321349793aa1a88d24d80a4b11aaed Mon Sep 17 00:00:00 2001 From: Kolja Schwenghagen Date: Tue, 19 Nov 2013 16:39:28 -0800 Subject: [PATCH 12/91] fixed a bug in access testcase --- app/tests/cases/models/access.test.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/tests/cases/models/access.test.php b/app/tests/cases/models/access.test.php index 0be292341..89bdc398e 100644 --- a/app/tests/cases/models/access.test.php +++ b/app/tests/cases/models/access.test.php @@ -41,33 +41,39 @@ function testLoadPermissions() $this->Aco = ClassRegistry::init('Aco'); $this->Aro = ClassRegistry::init('Aro'); - $allow = array('create' => 1, 'read' => 1, 'update' => 1, 'delete' => 1, 'id' => 259); - $deny = array('create' => -1, 'read' => -1, 'update' => -1, 'delete' => -1, 'id' => 259); + //id should not be used since it can change + $allow = array('create' => 1, 'read' => 1, 'update' => 1, 'delete' => 1); + $deny = array('create' => -1, 'read' => -1, 'update' => -1, 'delete' => -1); $acos = $this->Aco->find('threaded'); // Testing for super admin role $group_aro = $this->Aro->find('threaded', array('conditions'=>array('Aro.foreign_key'=>1, 'Aro.model'=>'Role'))); $superadmin = $this->Access->loadPermissions($acos, $group_aro); + unset($superadmin["controllers/users/add"]["id"]); $this->assertEqual($superadmin['controllers/users/add'], $allow); // Testing for admin role $group_aro = $this->Aro->find('threaded', array('conditions'=>array('Aro.foreign_key'=>2, 'Aro.model'=>'Role'))); $admin = $this->Access->loadPermissions($acos, $group_aro); + unset($admin["controllers/users/add"]["id"]); $this->assertEqual($admin['controllers/users/add'], $allow); // Testing for instructor role $group_aro = $this->Aro->find('threaded', array('conditions'=>array('Aro.foreign_key'=>3, 'Aro.model'=>'Role'))); $instructor = $this->Access->loadPermissions($acos, $group_aro); + unset($instructor["controllers/users/add"]["id"]); $this->assertEqual($instructor['controllers/users/add'], $allow); // Testing for tutor role $group_aro = $this->Aro->find('threaded', array('conditions'=>array('Aro.foreign_key'=>4, 'Aro.model'=>'Role'))); $tutor = $this->Access->loadPermissions($acos, $group_aro); + unset($tutor["controllers/users/add"]["id"]); $this->assertEqual($tutor['controllers/users/add'], $deny); // Testing for student role $group_aro = $this->Aro->find('threaded', array('conditions'=>array('Aro.foreign_key'=>5, 'Aro.model'=>'Role'))); $student = $this->Access->loadPermissions($acos, $group_aro); + unset($student["controllers/users/add"]["id"]); $this->assertEqual($student['controllers/users/add'], $deny); // Testing for invalid role From 897002a235de0f708bcaebc6267dda1887dac49f Mon Sep 17 00:00:00 2001 From: Kolja Schwenghagen Date: Wed, 20 Nov 2013 09:47:17 -0800 Subject: [PATCH 13/91] fixed a bug in access testcase --- .../cases/controllers/accesses_controller.test.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/tests/cases/controllers/accesses_controller.test.php b/app/tests/cases/controllers/accesses_controller.test.php index 8dcf0ebb7..215901eaf 100644 --- a/app/tests/cases/controllers/accesses_controller.test.php +++ b/app/tests/cases/controllers/accesses_controller.test.php @@ -87,32 +87,38 @@ public function getController() function testView() { - $allow = array('create' => 1, 'read' => 1, 'update' => 1, 'delete' => 1, 'id' => 22); - $deny = array('create' => -1, 'read' => -1, 'update' => -1, 'delete' => -1, 'id' => 22); + //id should not be used since it can change + $allow = array('create' => 1, 'read' => 1, 'update' => 1, 'delete' => 1); + $deny = array('create' => -1, 'read' => -1, 'update' => -1, 'delete' => -1); $superadmin = $this->testAction('/accesses/view/1', array('return' => 'vars')); $this->assertEqual($superadmin['permissions']['controllers/courses/add'], $allow); $this->assertEqual($superadmin['roleId'], 1); + unset($superadmin["controllers/users/add"]["id"]); $this->assertEqual($superadmin['title_for_layout'], 'Permissions Editor > superadmin'); $admin = $this->testAction('/accesses/view/2', array('return' => 'vars')); $this->assertEqual($admin['permissions']['controllers/courses/add'], $allow); $this->assertEqual($admin['roleId'], 2); + unset($admin["controllers/users/add"]["id"]); $this->assertEqual($admin['title_for_layout'], 'Permissions Editor > admin'); $instructor = $this->testAction('/accesses/view/3', array('return' => 'vars')); $this->assertEqual($instructor['permissions']['controllers/courses/add'], $allow); $this->assertEqual($instructor['roleId'], 3); + unset($instructor["controllers/users/add"]["id"]); $this->assertEqual($instructor['title_for_layout'], 'Permissions Editor > instructor'); $tutor = $this->testAction('/accesses/view/4', array('return' => 'vars')); $this->assertEqual($tutor['permissions']['controllers/courses/add'], $deny); $this->assertEqual($tutor['roleId'], 4); + unset($tutor["controllers/users/add"]["id"]); $this->assertEqual($tutor['title_for_layout'], 'Permissions Editor > tutor'); $student = $this->testAction('/accesses/view/5', array('return' => 'vars')); $this->assertEqual($student['permissions']['controllers/courses/add'], $deny); $this->assertEqual($student['roleId'], 5); + unset($student["controllers/users/add"]["id"]); $this->assertEqual($student['title_for_layout'], 'Permissions Editor > student'); } From 2378cb95d38e7bcc71e3e09571c7b965bc7aeb7c Mon Sep 17 00:00:00 2001 From: Kolja Schwenghagen Date: Wed, 20 Nov 2013 10:07:11 -0800 Subject: [PATCH 14/91] fixed a bug in access testcase --- .../cases/controllers/accesses_controller.test.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/tests/cases/controllers/accesses_controller.test.php b/app/tests/cases/controllers/accesses_controller.test.php index 215901eaf..5bd70e779 100644 --- a/app/tests/cases/controllers/accesses_controller.test.php +++ b/app/tests/cases/controllers/accesses_controller.test.php @@ -92,33 +92,33 @@ function testView() $deny = array('create' => -1, 'read' => -1, 'update' => -1, 'delete' => -1); $superadmin = $this->testAction('/accesses/view/1', array('return' => 'vars')); + unset($superadmin['permissions']['controllers/courses/add']["id"]); $this->assertEqual($superadmin['permissions']['controllers/courses/add'], $allow); $this->assertEqual($superadmin['roleId'], 1); - unset($superadmin["controllers/users/add"]["id"]); $this->assertEqual($superadmin['title_for_layout'], 'Permissions Editor > superadmin'); $admin = $this->testAction('/accesses/view/2', array('return' => 'vars')); + unset($admin['permissions']['controllers/courses/add']["id"]); $this->assertEqual($admin['permissions']['controllers/courses/add'], $allow); $this->assertEqual($admin['roleId'], 2); - unset($admin["controllers/users/add"]["id"]); $this->assertEqual($admin['title_for_layout'], 'Permissions Editor > admin'); $instructor = $this->testAction('/accesses/view/3', array('return' => 'vars')); + unset($instructor['permissions']['controllers/courses/add']["id"]); $this->assertEqual($instructor['permissions']['controllers/courses/add'], $allow); $this->assertEqual($instructor['roleId'], 3); - unset($instructor["controllers/users/add"]["id"]); $this->assertEqual($instructor['title_for_layout'], 'Permissions Editor > instructor'); $tutor = $this->testAction('/accesses/view/4', array('return' => 'vars')); + unset($tutor['permissions']['controllers/courses/add']["id"]); $this->assertEqual($tutor['permissions']['controllers/courses/add'], $deny); $this->assertEqual($tutor['roleId'], 4); - unset($tutor["controllers/users/add"]["id"]); $this->assertEqual($tutor['title_for_layout'], 'Permissions Editor > tutor'); $student = $this->testAction('/accesses/view/5', array('return' => 'vars')); + unset($student['permissions']['controllers/courses/add']["id"]); $this->assertEqual($student['permissions']['controllers/courses/add'], $deny); $this->assertEqual($student['roleId'], 5); - unset($student["controllers/users/add"]["id"]); $this->assertEqual($student['title_for_layout'], 'Permissions Editor > student'); } From b8baa956e4f4ee09304e1403ac7a47072eb985dd Mon Sep 17 00:00:00 2001 From: Trevor Date: Fri, 29 Nov 2013 16:23:59 -0800 Subject: [PATCH 15/91] Added Criteria View Mode Implemented a feature to display rubrics sorted by criteria as opposed to being sorted by students. Instructors will be able to select the view mode when creating their rubric. When selecting the view, instructors will be shown an example of what the rubric will look like in either mode. This feature only affects the student's view of the rubric, not the instructor's view. This feature also required an upgrade to the database as it introduced a new storage value for the view. This value could either be: 'criteria' or 'student'. --- app/config/core.php | 2 +- app/config/sql/delta_8.sql | 10 + app/config/sql/ipeer.sql | 3 +- app/config/sql/ipeer_samples_data.sql | 5 +- app/controllers/components/evaluation.php | 68 ++++-- app/controllers/evaluations_controller.php | 124 ++++++++--- app/controllers/rubrics_controller.php | 13 +- app/models/rubric.php | 4 + .../elements/rubrics/ajax_rubric_view.ctp | 120 ++++++++++- app/views/evaluations/rubric_eval_form.ctp | 203 ++++++++++++++++-- app/views/rubrics/edit.ctp | 31 +++ app/webroot/img/rubric/Sort_by_Criteria.jpg | Bin 0 -> 85142 bytes app/webroot/img/rubric/Sort_by_Student.jpg | Bin 0 -> 93117 bytes 13 files changed, 510 insertions(+), 73 deletions(-) create mode 100644 app/config/sql/delta_8.sql create mode 100644 app/webroot/img/rubric/Sort_by_Criteria.jpg create mode 100644 app/webroot/img/rubric/Sort_by_Student.jpg diff --git a/app/config/core.php b/app/config/core.php index 1dbc36b4c..a4d0c698d 100644 --- a/app/config/core.php +++ b/app/config/core.php @@ -319,7 +319,7 @@ /** * iPeer database version */ - Configure::write('DATABASE_VERSION', 7); + Configure::write('DATABASE_VERSION', 8); $CWL['LoginURL'] = 'https://www.auth.cwl.ubc.ca/auth/login'; diff --git a/app/config/sql/delta_8.sql b/app/config/sql/delta_8.sql new file mode 100644 index 000000000..72a38a2ef --- /dev/null +++ b/app/config/sql/delta_8.sql @@ -0,0 +1,10 @@ +-- This file contains queries that add a single column to two tables. +-- This column is used to hide/show the evaluation marks to the user. + +ALTER TABLE rubrics ADD view_mode VARCHAR(10) AFTER criteria; + +-- Update database version, done as the very last operation as a sign that +-- the update went well. +INSERT INTO `sys_parameters` (`parameter_code`, `parameter_value`, `parameter_type`, `description`, `record_status`, `creator_id`, `created`, `updater_id`, `modified`) VALUES +('database.version', '8', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()); + diff --git a/app/config/sql/ipeer.sql b/app/config/sql/ipeer.sql index 7731a4d72..600c201cf 100644 --- a/app/config/sql/ipeer.sql +++ b/app/config/sql/ipeer.sql @@ -1268,6 +1268,7 @@ CREATE TABLE IF NOT EXISTS `rubrics` ( `zero_mark` tinyint(1) NOT NULL DEFAULT '0', `lom_max` int(11) DEFAULT NULL, `criteria` int(11) DEFAULT NULL, + `view_mode` varchar(10) NOT NULL DEFAULT 'student', `availability` varchar(10) NOT NULL DEFAULT 'public', `template` varchar(20) NOT NULL DEFAULT 'horizontal', `creator_id` int(11) NOT NULL DEFAULT '0', @@ -1482,7 +1483,7 @@ INSERT INTO `sys_parameters` (`parameter_code`, `parameter_value`, `parameter_ty ('system.admin_email', 'Please enter the iPeer administrator\\''s email address.', 'S', NULL, 'A', 0, NOW(), NULL, NOW()), ('display.date_format', 'D, M j, Y g:i a', 'S', 'date format preference', 'A', 0, NOW(), NULL, NOW()), ('system.version', '3.1.0', 'S', NULL, 'A', 0, NOW(), NULL, NOW()), -('database.version', '7', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()), +('database.version', '8', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()), ('email.port', '25', 'S', 'port number for email smtp option', 'A', '0', NOW(), NULL , NOW()), ('email.host', 'localhost', 'S', 'host address for email smtp option', 'A', '0', NOW(), NULL , NOW()), ('email.username', '', 'S', 'username for email smtp option', 'A', '0', NOW(), NULL , NOW()), diff --git a/app/config/sql/ipeer_samples_data.sql b/app/config/sql/ipeer_samples_data.sql index 1731288f9..0bf900122 100644 --- a/app/config/sql/ipeer_samples_data.sql +++ b/app/config/sql/ipeer_samples_data.sql @@ -1683,6 +1683,7 @@ CREATE TABLE IF NOT EXISTS `rubrics` ( `zero_mark` tinyint(1) NOT NULL DEFAULT '0', `lom_max` int(11) DEFAULT NULL, `criteria` int(11) DEFAULT NULL, + `view_mode` varchar(10) NOT NULL DEFAULT 'student', `availability` varchar(10) NOT NULL DEFAULT 'public', `template` varchar(20) NOT NULL DEFAULT 'horizontal', `creator_id` int(11) NOT NULL DEFAULT '0', @@ -1696,7 +1697,7 @@ CREATE TABLE IF NOT EXISTS `rubrics` ( -- Dumping data for table `rubrics` -- -INSERT INTO `rubrics` VALUES (1, 'Term Report Evaluation', 0, 5, 3, 'public', 'horizontal', 1, '2006-06-20 15:21:50', NULL, '2006-06-20 15:21:50'); +INSERT INTO `rubrics` VALUES (1, 'Term Report Evaluation', 0, 5, 3, 'student', 'public', 'horizontal', 1, '2006-06-20 15:21:50', NULL, '2006-06-20 15:21:50'); -- -------------------------------------------------------- @@ -2012,7 +2013,7 @@ INSERT INTO `sys_parameters` (`parameter_code`, `parameter_value`, `parameter_ty ('system.admin_email', 'Please enter the iPeer administrator\\''s email address.', 'S', NULL, 'A', 0, NOW(), NULL, NOW()), ('display.date_format', 'D, M j, Y g:i a', 'S', 'date format preference', 'A', 0, NOW(), NULL, NOW()), ('system.version', '3.1.0', 'S', NULL, 'A', 0, NOW(), NULL, NOW()), -('database.version', '7', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()), +('database.version', '8', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()), ('email.port', '25', 'S', 'port number for email smtp option', 'A', '0', NOW(), NULL , NOW()), ('email.host', 'localhost', 'S', 'host address for email smtp option', 'A', '0', NOW(), NULL , NOW()), ('email.username', '', 'S', 'username for email smtp option', 'A', '0', NOW(), NULL , NOW()), diff --git a/app/controllers/components/evaluation.php b/app/controllers/components/evaluation.php index ce7cf0f6d..ae7c519c8 100644 --- a/app/controllers/components/evaluation.php +++ b/app/controllers/components/evaluation.php @@ -526,12 +526,14 @@ function loadRubricEvaluationDetail($event) * saveRubricEvaluation * * @param mixed $targetEvaluatee + * @param mixed $viewMode * @param mixed $params + * @param mixed $targetCriteria * * @access public * @return void */ - function saveRubricEvaluation($targetEvaluatee, $params=null) + function saveRubricEvaluation($targetEvaluatee, $viewMode, $params=null, $targetCriteria=null) { $this->Event = ClassRegistry::init('Event'); $this->Rubric = ClassRegistry::init('Rubric'); @@ -540,6 +542,7 @@ function saveRubricEvaluation($targetEvaluatee, $params=null) // assuming all are in the same order and same size $evaluator = $params['data']['Evaluation']['evaluator_id']; $groupEventId = $params['form']['group_event_id']; + $groupId = $params['form']['group_id']; $rubricId = $params['form']['rubric_id']; //Get the target event @@ -572,7 +575,7 @@ function saveRubricEvaluation($targetEvaluatee, $params=null) $evalRubric['EvaluationRubric']['comment'] = $params['form'][$targetEvaluatee.'gen_comment']; $score = $this->saveNGetEvalutionRubricDetail( - $evalRubric['EvaluationRubric']['id'], $rubric, $targetEvaluatee, $params['form']); + $evalRubric['EvaluationRubric']['id'], $rubric, $targetEvaluatee, $params['form'], $viewMode, $targetCriteria); $evalRubric['EvaluationRubric']['score'] = $score; if (!$this->EvaluationRubric->save($evalRubric)) { @@ -590,37 +593,76 @@ function saveRubricEvaluation($targetEvaluatee, $params=null) * @param mixed $rubric rubric * @param mixed $targetEvaluatee target evaluatee * @param mixed $form form + * @param mixed $viewMode view mode + * $param mixed $targetCriteria target criteria * * @access public * @return void */ - function saveNGetEvalutionRubricDetail ($evalRubricId, $rubric, $targetEvaluatee, $form) + function saveNGetEvalutionRubricDetail ($evalRubricId, $rubric, $targetEvaluatee, $form, $viewMode, $targetCriteria=null) { $this->EvaluationRubricDetail = ClassRegistry::init('EvaluationRubricDetail'); $totalGrade = 0; - $pos = 0; + + if ($viewMode == 0) { + $pos = 0; + for ($i=1; $i <= $rubric['Rubric']['criteria']; $i++) { + $this->EvaluationRubricDetail = ClassRegistry::init('EvaluationRubricDetail'); + //TODO: LOM = 1 + if ($rubric['Rubric']['lom_max'] == 1) { + $form[$targetEvaluatee."selected$i"] = ($form[$targetEvaluatee."selected$i"] ? $form[$targetEvaluatee."selected$i"] : 0); + } - for ($i=1; $i <= $rubric['Rubric']['criteria']; $i++) { + // get total possible grade for the criteria number ($i) + isset($form[$targetEvaluatee.'criteria_points_'.$i]) ? $grade = $form[$targetEvaluatee.'criteria_points_'.$i] : $grade = ""; + $selectedLom = $form['selected_lom_'.$targetEvaluatee.'_'.$i]; + $evalRubricDetail = $this->EvaluationRubricDetail->getByEvalRubricIdCritera($evalRubricId, $i); + if (isset($evalRubricDetail)) { + $this->EvaluationRubricDetail->id=$evalRubricDetail['EvaluationRubricDetail']['id'] ; + } + $evalRubricDetail['EvaluationRubricDetail']['evaluation_rubric_id'] = $evalRubricId; + $evalRubricDetail['EvaluationRubricDetail']['criteria_number'] = $i; + $evalRubricDetail['EvaluationRubricDetail']['criteria_comment'] = $form[$targetEvaluatee."comments"][$pos++]; + $evalRubricDetail['EvaluationRubricDetail']['selected_lom'] = $selectedLom; + $evalRubricDetail['EvaluationRubricDetail']['grade'] = $grade; + + if($selectedLom != NULL){ + $this->EvaluationRubricDetail->save($evalRubricDetail); + } + $this->EvaluationRubricDetail->id=null; + + $totalGrade += $grade; + } + } + elseif ($viewMode == 1) { + $this->EvaluationRubricDetail = ClassRegistry::init('EvaluationRubricDetail'); //TODO: LOM = 1 if ($rubric['Rubric']['lom_max'] == 1) { - $form[$targetEvaluatee."selected$i"] = ($form[$targetEvaluatee."selected$i"] ? $form[$targetEvaluatee."selected$i"] : 0); + $form[$targetEvaluatee."selected$targetCriteria"] = ($form[$targetEvaluatee."selected$targetCriteria"] ? $form[$targetEvaluatee."selected$targetCriteria"] : 0); } - // get total possible grade for the criteria number ($i) - $grade = $form[$targetEvaluatee.'criteria_points_'.$i]; - $selectedLom = $form['selected_lom_'.$targetEvaluatee.'_'.$i]; - $evalRubricDetail = $this->EvaluationRubricDetail->getByEvalRubricIdCritera($evalRubricId, $i); + isset($form[$targetEvaluatee.'criteria_points_'.$targetCriteria]) ? $grade = $form[$targetEvaluatee.'criteria_points_'.$targetCriteria] : $grade = ""; + $selectedLom = $form['selected_lom_'.$targetEvaluatee.'_'.$targetCriteria]; + + // Set up and save EvaluationRubricDetail + $evalRubricDetail = $this->EvaluationRubricDetail->getByEvalRubricIdCritera($evalRubricId, $targetCriteria); if (isset($evalRubricDetail)) { $this->EvaluationRubricDetail->id=$evalRubricDetail['EvaluationRubricDetail']['id'] ; } $evalRubricDetail['EvaluationRubricDetail']['evaluation_rubric_id'] = $evalRubricId; - $evalRubricDetail['EvaluationRubricDetail']['criteria_number'] = $i; - $evalRubricDetail['EvaluationRubricDetail']['criteria_comment'] = $form[$targetEvaluatee."comments"][$pos++]; + $evalRubricDetail['EvaluationRubricDetail']['criteria_number'] = $targetCriteria; + $evalRubricDetail['EvaluationRubricDetail']['criteria_comment'] = $form[$targetEvaluatee."comments"][$targetCriteria-1]; $evalRubricDetail['EvaluationRubricDetail']['selected_lom'] = $selectedLom; $evalRubricDetail['EvaluationRubricDetail']['grade'] = $grade; $this->EvaluationRubricDetail->save($evalRubricDetail); $this->EvaluationRubricDetail->id=null; - $totalGrade += $grade; + + // Loop through all criteria to get total grade + foreach ($rubric['RubricsCriteria'] as $rubricCriteria) { + $criteriaNum = $rubricCriteria['criteria_num']; + isset($form[$targetEvaluatee.'criteria_points_'.$criteriaNum]) ? $grade = $form[$targetEvaluatee.'criteria_points_'.$criteriaNum] : $grade = 0; + $totalGrade += $grade; + } } return $totalGrade; } diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index 2987dc51e..922a41cc3 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -707,7 +707,9 @@ function _makeRubricEvaluation ($event, $groupId) if (!$commentsNeeded && empty($user['Evaluation']['EvaluationRubric']['comment'])) { $commentsNeeded = true; } - $evaluated++; + if (count($user['Evaluation']['EvaluationRubricDetail']) == count($rubricDetail['rubric']['RubricsCriteria'])){ + $evaluated++; + } } else { $commentsNeeded = true; // not evaluated = comments needed } @@ -724,42 +726,98 @@ function _makeRubricEvaluation ($event, $groupId) $groupId = $this->params['form']['group_id']; $event = $this->Event->findById($eventId); - // find out whose evaluation is submitted - foreach ($this->params['form']['memberIDs'] as $userId) { - if (isset($this->params['form'][$userId])) { - $targetEvaluatee = $userId; - break; + + // Student View Mode + if(isset($this->params['form']['memberIDs'])){ + // find out whose evaluation is submitted + foreach ($this->params['form']['memberIDs'] as $userId) { + if (isset($this->params['form'][$userId])) { + $targetEvaluatee = $userId; + break; + } } - } - // validation has been modified to only return true - /*if (!$this->validRubricEvalComplete($this->params['form'])) { - $this->Session->setFlash(__('validRubricEvalCompleten failure', true)); - $this->redirect('/evaluations/makeEvaluation/'.$eventId.'/'.$groupId); - return; - }*/ - - if ($this->Evaluation->saveRubricEvaluation($targetEvaluatee, $this->params)) { - // check whether comments are given, if not and it is required, send msg - $comments = $this->params['form'][$targetEvaluatee.'comments']; - $filter = array_filter(array_map('trim', $comments)); // filter out blank comments - $msg = array(); - $sub = $this->EvaluationSubmission->getEvalSubmissionByEventIdGroupIdSubmitter($eventId, $groupId, User::get('id')); - if ($event['Event']['com_req'] && (count($filter) < count($comments))) { - $msg[] = 'some comments are missing'; + // validation has been modified to only return true + /*if (!$this->validRubricEvalComplete($this->params['form'])) { + $this->Session->setFlash(__('validRubricEvalCompleten failure', true)); + $this->redirect('/evaluations/makeEvaluation/'.$eventId.'/'.$groupId); + return; + }*/ + + if ($this->Evaluation->saveRubricEvaluation($targetEvaluatee, 0, $this->params)) { + // check whether comments are given, if not and it is required, send msg + $comments = $this->params['form'][$targetEvaluatee.'comments']; + $filter = array_filter(array_map('trim', $comments)); // filter out blank comments + $msg = array(); + $sub = $this->EvaluationSubmission->getEvalSubmissionByEventIdGroupIdSubmitter($eventId, $groupId, User::get('id')); + if ($event['Event']['com_req'] && (count($filter) < count($comments))) { + $msg[] = 'some comments are missing'; + } + if (empty($sub)) { + $msg[] = 'you still have to submit the evaluation with the Submit button below'; + } + $suffix = empty($msg) ? '.' : ', but '.implode(' and ', $msg).'.'; + $this->Session->setFlash(__('Your evaluation has been saved'.$suffix, true)); + $this->redirect('/evaluations/makeEvaluation/'.$eventId.'/'.$groupId); + return; + } else { + //Found error + //Validate the error why the Event->save() method returned false + $this->validateErrors($this->Event); + $this->Session->setFlash(__('Your evaluation was not saved successfully', true)); + $this->redirect('/evaluations/makeEvaluation/'.$eventId.'/'.$groupId); + return; } - if (empty($sub)) { - $msg[] = 'you still have to submit the evaluation with the Submit button below'; + } + // Criteria View Mode + elseif(isset($this->params['form']['criteriaIDs'])){ + // find out the criteria submitted + // general comments section should be given value of null + $targetCriteria = null; + foreach ($this->params['form']['criteriaIDs'] as $criteriaId) { + if (isset($this->params['form'][$criteriaId])) { + $targetCriteria = $criteriaId; + break; + } + } + + $evaluator = $this->params['data']['Evaluation']['evaluator_id']; + $groupMembers = $this->User->getEventGroupMembersNoTutors($groupId, $event['Event']['self_eval'], $evaluator); + + // Criteria will be null if the submitted section was 'General Comments' + if ($targetCriteria != null) { + $viewMode = 1; + } + else { + $viewMode = 0; + } + + // Loop through and save every group member for specified criteria + foreach ($groupMembers as $groupMember){ + $targetEvaluatee = $groupMember['User']['id']; + + if ($this->Evaluation->saveRubricEvaluation($targetEvaluatee, $viewMode, $this->params, $targetCriteria)) { + // check whether comments are given, if not and it is required, send msg + $comments = $this->params['form'][$targetEvaluatee.'comments']; + $filter = array_filter(array_map('trim', $comments)); // filter out blank comments + $msg = array(); + $sub = $this->EvaluationSubmission->getEvalSubmissionByEventIdGroupIdSubmitter($eventId, $groupId, User::get('id')); + if ($event['Event']['com_req'] && (count($filter) < count($comments))) { + $msg[] = 'some comments are missing'; + } + if (empty($sub)) { + $msg[] = 'you still have to submit the evaluation with the Submit button below'; + } + $suffix = empty($msg) ? '.' : ', but '.implode(' and ', $msg).'.'; + $this->Session->setFlash(__('Your evaluation has been saved'.$suffix, true)); + } else { + //Found error + //Validate the error why the Event->save() method returned false + $this->validateErrors($this->Event); + $this->Session->setFlash(__('Your evaluation was not saved successfully', true)); + break; + } } - $suffix = empty($msg) ? '.' : ', but '.implode(' and ', $msg).'.'; - $this->Session->setFlash(__('Your evaluation has been saved'.$suffix, true)); - $this->redirect('/evaluations/makeEvaluation/'.$eventId.'/'.$groupId); - return; - } else { - //Found error - //Validate the error why the Event->save() method returned false - $this->validateErrors($this->Event); - $this->Session->setFlash(__('Your evaluation was not saved successfully', true)); $this->redirect('/evaluations/makeEvaluation/'.$eventId.'/'.$groupId); return; } diff --git a/app/controllers/rubrics_controller.php b/app/controllers/rubrics_controller.php index 3caa44b8a..fb1b3e22b 100644 --- a/app/controllers/rubrics_controller.php +++ b/app/controllers/rubrics_controller.php @@ -92,7 +92,9 @@ function setUpAjaxList() array("Rubric.event_count", "", "", "hidden"), array("Rubric.creator_id", "", "", "hidden"), array("Rubric.creator", __("Creator", true), "8em", "action", "View Creator"), - array("Rubric.created", __("Creation Date", true), "10em", "date")); + array("Rubric.created", __("Creation Date", true), "10em", "date"), + array("Rubric.view_mode", __("View Mode", true), "4em", "number") + ); // Just list all and my evaluations for selections $userList = array($this->Auth->user('id') => "My Evaluations"); @@ -273,7 +275,14 @@ function add() if (!empty($this->data)) { $this->set('action', __('Add Rubric (Step 2)', true)); $this->set('data', $this->data); - + + //Sets initial values for radio buttons + if($this->data['Rubric']['availability'] == ""){ + $this->data['Rubric']['availability'] = 'private'; + } + if($this->data['Rubric']['view_mode'] == ""){ + $this->data['Rubric']['view_mode'] = 'student'; + } if (isset($this->params['form']['submit'])) { if ($this->__processForm()) { $this->Session->setFlash(__('The rubric was added successfully.', true), 'good'); diff --git a/app/models/rubric.php b/app/models/rubric.php index 929dde46a..1f181abcd 100644 --- a/app/models/rubric.php +++ b/app/models/rubric.php @@ -66,6 +66,10 @@ class Rubric extends EvaluationBase 'rule' => 'notEmpty', 'message' => 'Please select the number of Criteria.' ), + 'view_mode' => array( + 'rule' => 'notEmpty', + 'message' => 'Please select a view mode.' + ), ); /** diff --git a/app/views/elements/rubrics/ajax_rubric_view.ctp b/app/views/elements/rubrics/ajax_rubric_view.ctp index 4f4632c45..c8bb35afc 100644 --- a/app/views/elements/rubrics/ajax_rubric_view.ctp +++ b/app/views/elements/rubrics/ajax_rubric_view.ctp @@ -7,7 +7,13 @@ $zero_mark = $data['Rubric']['zero_mark']; isset($user)? $userId = $user['id'] : $userId = ''; isset($user['Evaluation'])? $evaluation = $user['Evaluation'] : $evaluation = null; $reqCom = isset($event) && $event['Event']['com_req'] ? '
('.__('required', true).')' : ''; +if(!isset($viewMode)){ + $viewMode = 0; +} ?> + + + @@ -23,7 +29,7 @@ $reqCom = isset($event) && $event['Event']['com_req'] ? '
( - + @@ -40,7 +46,7 @@ $reqCom = isset($event) && $event['Event']['com_req'] ? '
(
@@ -58,7 +64,7 @@ $reqCom = isset($event) && $event['Event']['com_req'] ? '
(
@@ -74,12 +80,116 @@ $reqCom = isset($event) && $event['Event']['com_req'] ? '
(
- +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
+ '.$user['first_name'].' '.$user['last_name']?>

+ +
+
+ +
+ .value=;" /> +
+ + + +
:
+ + +
+ + +
+ + \ No newline at end of file diff --git a/app/views/evaluations/rubric_eval_form.ctp b/app/views/evaluations/rubric_eval_form.ctp index d38933b8b..069659a89 100644 --- a/app/views/evaluations/rubric_eval_form.ctp +++ b/app/views/evaluations/rubric_eval_form.ctp @@ -1,22 +1,47 @@ script('ricobase')?> @@ -81,7 +106,18 @@ function saveButtonVal(userId) { - + + + +
+
@@ -90,7 +126,22 @@ function saveButtonVal(userId) {
- + + ( Saved ) - @@ -99,16 +150,17 @@ function saveButtonVal(userId) {

'rubrics', $viewData , 'evaluate'=>1, 'user'=>$user, 'event'=>$event); + $params = array('controller'=>'rubrics', $viewData , 'evaluate'=>1, 'user'=>$user, 'event'=>$event, 'viewMode'=>$viewMode); echo $this->element('rubrics/ajax_rubric_view', $params); ?>
submit('Save This Section', array('name'=>$user['id'], 'div'=>'saveThisSection')); - echo "
".__('Please complete all the questions marked red before saving.
', true).""; + echo "
".__('Please complete all the questions marked red before saving.
', true); echo __('Make sure you save this section before moving on to the other ones!', true)."

"; ?> +
@@ -118,6 +170,125 @@ function saveButtonVal(userId) {
+ + + + + + + + + +
+
+ + +
+
+ + + + ( Saved ) + + - + +
+
+
+ 'rubrics', $viewData , 'evaluate'=>1, 'criteria'=>$row, 'event'=>$event, 'viewMode'=>$viewMode); + echo $this->element('rubrics/ajax_rubric_view', $params); + ?> + + + + + +
+ submit('Save This Section', array('name'=>$row['criteria_num'], 'div'=>'saveThisSection')); + echo "
".__('Please complete all the questions marked red before saving.
', true); + echo __('Make sure you save this section before moving on to the other ones!', true)."

"; + ?> +
+
+
+ +
+
+ + + + ( Saved ) + + - + +
+
+
+ + + + + + + + + + + +
+ +
+ submit('Save This Section', array('name'=>$value, 'div'=>'saveThisSection')); + } + else{ + echo $form->submit('Save This Section', array('name'=>$value, 'disabled'=>true, 'div'=>'saveThisSection')); + echo "
".__('This section will be available once the previous sections are completed.
', true); + } + echo "
".__('Please complete all the questions marked red before saving.
', true); + echo "

"; + ?> +
+
+
+
+
+ + "; } else { - echo ""; + echo ""; } } } @@ -2135,7 +2135,7 @@ function viewSurveySummary($eventId) fputcsv($fh, array($key, $value)); } - $header=array(_t("Group Number"), _t("Group Name"), _t("First Name"), _t("Last Name"), _t("Student Number"), _t("Email"), _t("General Comments"), _t("Score"), _t("Specific Comments")); + $header=array(__("Group Number", true), __("Group Name", true), __("First Name", true), __("Last Name", true), __("Student Number", true), __("Email", true), __("General Comments", true), __("Score", true), __("Specific Comments", true)); fputcsv($fh, $header); foreach ($user_data as $key => $value) { @@ -2175,7 +2175,7 @@ function viewSurveySummary($eventId) unset($line); } fclose($fh); - header(_t("Location:")." ../tmp/test/output.csv"); + header(__("Location:", true)." ../tmp/test/output.csv"); diff --git a/app/controllers/groups_controller.php b/app/controllers/groups_controller.php index 0d67a069d..86b082db4 100644 --- a/app/controllers/groups_controller.php +++ b/app/controllers/groups_controller.php @@ -50,7 +50,7 @@ function _postProcess($data) function beforeFilter() { parent::beforeFilter(); - + $allowTypes = array( 'text/plain', 'text/csv', 'application/csv', 'application/csv.ms-excel', 'application/octet-stream', @@ -367,7 +367,7 @@ function import($courseId = null) $courseId = $this->params['data']['Group']['Course']; $this->params['data']['Group']['course_id'] = $courseId; $filename = $this->params['form']['file']['name']; - $update = ($this->params['data']['Group']['update_groups']) ? + $update = ($this->params['data']['Group']['update_groups']) ? true : false; $identifier = $this->params['data']['Group']['identifiers']; @@ -414,7 +414,7 @@ function import($courseId = null) * @return void */ function _addGroupByImport($lines, $courseId, $update, $identifier) - { + { // Check for parameters if (empty($lines) || empty($courseId)) { return array(); @@ -422,14 +422,14 @@ function _addGroupByImport($lines, $courseId, $update, $identifier) // Remove duplicate entries $lines = array_map("unserialize", array_unique(array_map("serialize", $lines))); - + // pre-process the lines in the file first $filter = 'return (count(array_filter($user)) != 2);'; $invalid = array_filter($lines, create_function('$user', $filter)); - $valid = array_diff_key($lines, $invalid); + $valid = array_diff_key($lines, $invalid); $users = Set::combine($valid, '{n}.'.IMPORT_GROUP_IDENTIFIER, '', '{n}.'.IMPORT_GROUP_GROUP_NAME); $names = array_unique(Set::extract($valid, '{n}.'.IMPORT_GROUP_GROUP_NAME)); - + $groupSuccess = array(); $groupFailure = array(); foreach ($names as $name) { @@ -438,7 +438,7 @@ function _addGroupByImport($lines, $courseId, $update, $identifier) $groupSuccess[$name] = $inGroup; } else { $groupNum = $this->Group->getFirstAvailGroupNum($courseId); - $tmp = array('Group' => array('group_num' => $groupNum, 'group_name' => $name, + $tmp = array('Group' => array('group_num' => $groupNum, 'group_name' => $name, 'course_id' => $courseId, 'creator_id' => $this->Auth->user('id'))); $this->Group->id = null; if ($this->Group->save($tmp)) { @@ -448,7 +448,7 @@ function _addGroupByImport($lines, $courseId, $update, $identifier) } } } - + $memSuccess = array(); $memFailure = array(); $tutors = $this->UserTutor->find('list', array( @@ -463,7 +463,7 @@ function _addGroupByImport($lines, $courseId, $update, $identifier) 'fields' => array('User.'.$identifier) )); $notExist = array_diff($identifiers, $members); - + if (!isset($groupSuccess[$groupName])) { $stu = array_keys($members); foreach ($stu as $userId) { @@ -471,16 +471,16 @@ function _addGroupByImport($lines, $courseId, $update, $identifier) } continue; } - + $groupId = $groupSuccess[$groupName]; $old = $this->GroupsMembers->find('list', array( 'conditions' => array('group_id' => $groupId), 'fields' => 'user_id')); - + if ($update) { $diff = array_diff($old, array_keys($members)); $this->GroupsMembers->deleteAll(array('user_id' => $diff)); } - + $stu = array_keys($members); foreach ($stu as $userId) { if (in_array($userId, $old)) { @@ -548,15 +548,15 @@ function export($courseId) $fileContent = array(); $groups = $this->data['Member']['Member']; $GroupColumns = array( - 'Group.group_num' => array('form' => 'include_group_numbers', 'title' => _t('Group Number')), - 'Group.group_name' => array('form' => 'include_group_names', 'title' => _t('Group Name')), + 'Group.group_num' => array('form' => 'include_group_numbers', 'title' => __('Group Number', true)), + 'Group.group_name' => array('form' => 'include_group_names', 'title' => __('Group Name', true)), ); // took out emails $UserColumns = array( - 'Member.username' => array('form' => 'include_usernames', 'title' => _t('Username')), - 'Member.student_no' => array('form' => 'include_student_id', 'title' => _t('Student No')), - 'Member.first_name' => array('form' => 'include_student_name', 'title' => _t('First Name')), - 'Member.last_name' => array('form' => 'include_student_name', 'title' => _t('Last Name')), + 'Member.username' => array('form' => 'include_usernames', 'title' => __('Username', true)), + 'Member.student_no' => array('form' => 'include_student_id', 'title' => __('Student No', true)), + 'Member.first_name' => array('form' => 'include_student_name', 'title' => __('First Name', true)), + 'Member.last_name' => array('form' => 'include_student_name', 'title' => __('Last Name', true)), ); $titles = array(); $gFields = array(); diff --git a/app/controllers/install_controller.php b/app/controllers/install_controller.php index 7da8328b1..488ba68a7 100644 --- a/app/controllers/install_controller.php +++ b/app/controllers/install_controller.php @@ -56,7 +56,7 @@ public function beforeFilter() function index() { if (IS_INSTALLED) { - $this->Session->setFlash(__('WARNING: It looks like you already have a instance running. Reinstalling will remove all your current data. Remove '.TMP.'installed.txt to proceed.', true)); + $this->Session->setFlash(sprintf(__('WARNING: It looks like you already have a instance running. Reinstalling will remove all your current data. Remove %s to proceed.', true), TMP.'installed.txt')); } } diff --git a/app/controllers/mixevals_controller.php b/app/controllers/mixevals_controller.php index b7d9ae041..9df7e3642 100644 --- a/app/controllers/mixevals_controller.php +++ b/app/controllers/mixevals_controller.php @@ -212,7 +212,7 @@ function view($id) // check to see if $id is a valid mixed evaluation if (empty($eval)) { - $this->Session->setFlash(_t('Error: Invalid Mixeval ID.')); + $this->Session->setFlash(__('Error: Invalid Mixeval ID.', true)); $this->redirect('index'); return; } @@ -273,7 +273,7 @@ function add() { // Check that the user has permission to access this page if (!User::hasPermission('controllers/Mixevals')) { - $this->Session->setFlash(_t('Error: You do not have permission to edit this evaluation')); + $this->Session->setFlash(__('Error: You do not have permission to edit this evaluation', true)); $this->redirect('index'); return; } @@ -401,7 +401,7 @@ public function _transactionalSave() { // MixevalQuestionDesc. if (!$this->Mixeval->saveAll($this->data, array('validate' => 'only'))){ $this->Session->setFlash( - _t('Unable to save, please check below for error messages.')); + __('Unable to save, please check below for error messages.', true)); return; } @@ -486,7 +486,7 @@ function getExistingDescId($x) $ret = $this->Mixeval->save($this->data); if (!$ret) { $this->Session->setFlash( - _t('Unable to save the mixed evaluation.')); + __('Unable to save the mixed evaluation.', true)); $continue = false; } } @@ -502,7 +502,7 @@ function getExistingDescId($x) $this->MixevalQuestion->create(); if (!$this->MixevalQuestion->save($saveQ)) { $this->Session->setFlash( - _t("Unable to save this mixed eval's questions.")); + __("Unable to save this mixed eval's questions.", true)); $continue = false; break; } @@ -527,7 +527,7 @@ function getExistingDescId($x) $this->MixevalQuestionDesc->create(); if (!$this->MixevalQuestionDesc->save($saveDesc)) { $this->Session->setFlash( - _t('Unable to save the mixed eval question descs.')); + __('Unable to save the mixed eval question descs.', true)); $continue = false; break; } @@ -538,7 +538,7 @@ function getExistingDescId($x) if ($continue) { $this->Mixeval->commit(); $this->Session->setFlash( - _t('The mixed evaluation was saved successfully.'), 'good'); + __('The mixed evaluation was saved successfully.', true), 'good'); // TODO Maybe redirect to view evaluation instead? // And put an Edit button in the view evaluation too $this->redirect('index'); @@ -589,7 +589,7 @@ function edit($id) if (!is_numeric($id) || !$this->Mixeval->field('id', array('id' => $id)) ){ - $this->Session->setFlash(_t('Error: Invalid ID.')); + $this->Session->setFlash(__('Error: Invalid ID.', true)); $this->redirect('index'); return; } @@ -610,7 +610,7 @@ function edit($id) array('conditions' => array('event_id' => $events))); if (!empty($subs)) { $this->Session->setFlash(sprintf( - _t('%s cannot be edited now that submissions have been made. Please make a copy.'), + __('%s cannot be edited now that submissions have been made. Please make a copy.', true), $this->Mixeval->field('name', array('id' => $id)) )); $this->redirect('index'); diff --git a/app/controllers/surveygroups_controller.php b/app/controllers/surveygroups_controller.php index 5a6294199..67e4f066c 100644 --- a/app/controllers/surveygroups_controller.php +++ b/app/controllers/surveygroups_controller.php @@ -101,7 +101,7 @@ function index($courseId) $this->redirect('index'); return; } - + $this->set('course', $course); // Set up the basic static ajax list variables $this->setUpAjaxList(); @@ -143,13 +143,13 @@ function makegroups($course_id) $this->redirect('index'); return; } - + // checks that the dom extension and DOMDocument class exists which are needed for TeamMaker if (!(extension_loaded('dom') && class_exists('DOMDocument'))) { - $this->Session->setFlash(_t('DOMDocument could not be found. Please contact your - system administrator to use TeamMaker.')); + $this->Session->setFlash(__('DOMDocument could not be found. Please contact your + system administrator to use TeamMaker.', true)); } - + $this->set('breadcrumb', $this->breadcrumb->push(array('course' => $course['Course'])) ->push(__('Create Group Set', true))); $this->set('events', $this->Event->find('list', array('conditions' => array('course_id' => $course_id, 'event_template_type_id' => 3)))); @@ -550,7 +550,7 @@ function export($courseId) 'conditions' => array('group_set_id' => $this->data['SurveyGroup']['survey_group_set']), 'contain' => array('Member' => array('fields' => array_keys($fields))) )); - $members = array_merge(array(implode(',', $header)), + $members = array_merge(array(implode(',', $header)), $this->ExportCsv->buildSurveyGroupSet($groups, $fields, $group_no)); $members = implode("\n", $members); header('Content-Type: application/csv'); diff --git a/app/locale/default.pot b/app/locale/default.pot index aa29ffe63..5a22aef5f 100644 --- a/app/locale/default.pot +++ b/app/locale/default.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2012-12-18 00:54-0800\n" +"POT-Creation-Date: 2014-02-20 18:43-0800\n" "PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n" "Last-Translator: NAME \n" "Language-Team: LANGUAGE \n" @@ -14,4310 +14,4716 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: /controllers/courses_controller.php:42 -msgid "Web" +#: /Users/compass/projects/ipeer/src/app_controller.php:74 +msgid "An invalid timezone is provided, please edit \"system.timezone\"" msgstr "" -#: /controllers/courses_controller.php:43 -#: /controllers/events_controller.php:99 -#: /views/courses/view.ctp:6 -#: /views/elements/searchs/evaluation_result_search_panel.ctp:12 -#: /views/elements/searchs/evaluation_search_panel.ctp:14 -#: /views/elements/searchs/instructor_search_panel.ctp:12 -#: /views/events/edit.ctp:10 -#: /views/events/view.ctp:7 +#: /Users/compass/projects/ipeer/src/controllers/accesses_controller.php:27 +msgid "Error: Invalid Id." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/accesses_controller.php:62;114 +msgid "Error: Updating Permissions failed." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/accesses_controller.php:112 +msgid "Permissions have been updated" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:69 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:126 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:6 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_result_search_panel.ctp:12 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_search_panel.ctp:14 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/instructor_search_panel.ctp:12 +#: /Users/compass/projects/ipeer/src/views/events/edit.ctp:10 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:7 msgid "Course" msgstr "" -#: /controllers/courses_controller.php:44 -#: /controllers/events_controller.php:100 -#: /views/courses/view.ctp:21 -#: /views/elements/events/ajax_event_list.ctp:16 -#: /views/elements/events/ajax_title_validate.ctp:5 -#: /views/elements/framework/view_user_detail.ctp:34 -#: /views/users/edit_profile.ctp:39 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:70 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:127 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:21 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:16 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_title_validate.ctp:5 +#: /Users/compass/projects/ipeer/src/views/elements/framework/view_user_detail.ctp:34 +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:21 +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:15 msgid "Title" msgstr "" -#: /controllers/courses_controller.php:46 -#: /controllers/evaluations_controller.php:118 -#: /controllers/sysparameters_controller.php:63 -#: /views/courses/view.ctp:25 -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:16 -#: /views/elements/searchs/evaluation_result_search_panel.ctp:33 -#: /views/groups/edit.ctp:19 -#: /views/groups/view.ctp:5 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:72 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:121 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:63 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:25 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:16 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_result_search_panel.ctp:33 msgid "Status" msgstr "" -#: /controllers/courses_controller.php:46 -#: /views/courses/view.ctp:26 -#: /views/groups/edit.ctp:18 -#: /views/groups/view.ctp:13 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:72 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:26 msgid "Active" msgstr "" -#: /controllers/courses_controller.php:46 -#: /views/courses/view.ctp:26 -#: /views/groups/edit.ctp:18 -#: /views/groups/view.ctp:15 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:72 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:26 msgid "Inactive" msgstr "" -#: /controllers/courses_controller.php:47 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:73 msgid "Created by" msgstr "" -#: /controllers/courses_controller.php:66 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:92 msgid "Are you sure you want to delete this course permanently?" msgstr "" -#: /controllers/courses_controller.php:69 -#: /controllers/groups_controller.php:102 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:95 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:126 msgid "Course Home" msgstr "" -#: /controllers/courses_controller.php:70 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:96 msgid "View Record" msgstr "" -#: /controllers/courses_controller.php:71;288 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:97;337 msgid "Edit Course" msgstr "" -#: /controllers/courses_controller.php:72 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:98 msgid "Delete Course" msgstr "" -#: /controllers/courses_controller.php:73 -#: /controllers/emailer_controller.php:141 -#: /controllers/emailtemplates_controller.php:130 -#: /controllers/groups_controller.php:104 -#: /controllers/mixevals_controller.php:144 -#: /controllers/rubrics_controller.php:163 -#: /controllers/simpleevaluations_controller.php:169 -#: /controllers/surveys_controller.php:113 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:99 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:95 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:128 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:128 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:159 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:163 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:166 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:141 msgid "View Creator" msgstr "" -#: /controllers/courses_controller.php:154;173;283;304 -#: /controllers/evaluations_controller.php:249;264;1123;1384;1594;1684 -#: /controllers/events_controller.php:188;287 -#: /controllers/groups_controller.php:124;171;194;249;306;364;650 -#: /controllers/surveygroups_controller.php:142;195;399 -#: /controllers/users_controller.php:211;561 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:173;193;306;353 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:259;275;1783;1872 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:220;320 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:147;196;220;276;334;359;527 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:100;142;501 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:248;584 msgid "Error: Course does not exist or you do not have permission to view this course." msgstr "" -#: /controllers/courses_controller.php:274 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:324 msgid "The course was updated successfully." msgstr "" -#: /controllers/courses_controller.php:277 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:328 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:167 msgid "Error: Course edits could not be saved." msgstr "" -#: /controllers/courses_controller.php:317 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:366 msgid "The course was deleted successfully." msgstr "" -#: /controllers/departments_controller.php:18 -#: /controllers/faculties_controller.php:15 -msgid "Permission to access departments not found." +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:388 +msgid "The student has already submitted to the destination survey" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:420 +msgid "%s was successfully %s to %s." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:422 +msgid "%s was not successfully %s to %s." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:431 +msgid " %s was unsuccessfully enrolled to %s." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:439 +msgid " %s was unsuccessfully unenrolled from %s." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:458 +msgid "Move Students" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:526 +msgid "student number" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:526 +msgid "username" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:535 +msgid "Error: Event was unable to be created." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:557 +msgid "No student with %s %s exists." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:577 +msgid "The student could not be enrolled to the destination course." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:605 +msgid "The student's survey submission could not be transferred, however they are enrolled in the destination course." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:611 +msgid "Success." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:616 +msgid " However they were unsuccessfully unenrolled from the source course." msgstr "" -#: /controllers/departments_controller.php:36 +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:619 +msgid " However no student with %s %s was enrolled in the source course." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:623 +msgid "The student has already submitted a peer evaluation in the source course." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/courses_controller.php:627 +msgid "The student has already submitted to the\n destination survey, therefore the survey submission from the source survey was not transferred." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/departments_controller.php:29 msgid "You do not have access to any faculties" msgstr "" -#: /controllers/departments_controller.php:59;100 +#: /Users/compass/projects/ipeer/src/controllers/departments_controller.php:53;96 msgid "Invalid department" msgstr "" -#: /controllers/departments_controller.php:81;106 +#: /Users/compass/projects/ipeer/src/controllers/departments_controller.php:77;104 msgid "The department has been saved" msgstr "" -#: /controllers/departments_controller.php:84;109 +#: /Users/compass/projects/ipeer/src/controllers/departments_controller.php:80;107 msgid "The department could not be saved. Please, try again." msgstr "" -#: /controllers/departments_controller.php:124 +#: /Users/compass/projects/ipeer/src/controllers/departments_controller.php:122 msgid "Invalid id for department" msgstr "" -#: /controllers/departments_controller.php:128 +#: /Users/compass/projects/ipeer/src/controllers/departments_controller.php:127 msgid "Department deleted" msgstr "" -#: /controllers/departments_controller.php:131 +#: /Users/compass/projects/ipeer/src/controllers/departments_controller.php:131 msgid "Department was not deleted" msgstr "" -#: /controllers/emailer_controller.php:73 -#: /controllers/emailtemplates_controller.php:60 -#: /views/emailer/view.ctp:23 -#: /views/evaltools/index.ctp:97 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:45 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:62 +#: /Users/compass/projects/ipeer/src/views/emailer/view.ctp:19 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:102 msgid "Subject" msgstr "" -#: /controllers/emailer_controller.php:74 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:46 msgid "Scheduled On" msgstr "" -#: /controllers/emailer_controller.php:75;76 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:47;48 +#: /Users/compass/projects/ipeer/src/views/emailer/view.ctp:29 msgid "Sent" msgstr "" -#: /controllers/emailer_controller.php:76 -#: /controllers/evaluations_controller.php:81 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:48 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:84 msgid "Not Yet" msgstr "" -#: /controllers/emailer_controller.php:78 -#: /controllers/emailtemplates_controller.php:64 -#: /controllers/mixevals_controller.php:76 -#: /controllers/rubrics_controller.php:94 -#: /controllers/simpleevaluations_controller.php:102 -#: /controllers/surveys_controller.php:82 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:50 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:66 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:86 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:95 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:101 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:82 msgid "Creation Date" msgstr "" -#: /controllers/emailer_controller.php:86 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:58 msgid "Email to show:" msgstr "" -#: /controllers/emailer_controller.php:137 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:91 msgid "Are you sure you want to cancel this email?" msgstr "" -#: /controllers/emailer_controller.php:139 -#: /views/emailer/view.ctp:6 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:93 +#: /Users/compass/projects/ipeer/src/views/emailer/view.ctp:3 msgid "View Email" msgstr "" -#: /controllers/emailer_controller.php:140 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:94 msgid "Cancel Email" msgstr "" -#: /controllers/emailer_controller.php:207 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:164 msgid "Invalid Id" msgstr "" -#: /controllers/emailer_controller.php:217 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:174 msgid "Error: You do not have permission to write emails to this course" msgstr "" -#: /controllers/emailer_controller.php:232 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:182 msgid "Error: You do not have permission to write emails to this group" msgstr "" -#: /controllers/emailer_controller.php:238 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:188 msgid "Write Email" msgstr "" -#: /controllers/emailer_controller.php:282 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:235 msgid "The Email was saved successfully" msgstr "" -#: /controllers/emailer_controller.php:304;364 -#: /controllers/mixevals_controller.php:536 -#: /controllers/simpleevaluations_controller.php:514 -#: /controllers/surveys_controller.php:389 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:252;300 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:787 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:447 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:417 msgid "Invalid ID." msgstr "" -#: /controllers/emailer_controller.php:329 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:270 msgid "Error: You do not have permission to cancel this email schedule" msgstr "" -#: /controllers/emailer_controller.php:336 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:277 msgid "The Email was canceled successfully." msgstr "" -#: /controllers/emailer_controller.php:338 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:279 msgid "Email cancellation failed." msgstr "" -#: /controllers/emailer_controller.php:343 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:284 msgid "Cannot cancel: Email is already sent." msgstr "" -#: /controllers/emailer_controller.php:392 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:318 msgid "Error: You do not have permission to view this email schedule" msgstr "" -#: /controllers/emailer_controller.php:493 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:425 msgid "All students in course: " msgstr "" -#: /controllers/emailer_controller.php:505 +#: /Users/compass/projects/ipeer/src/controllers/emailer_controller.php:433 msgid "All students in group: " msgstr "" -#: /controllers/emailer_controller.php:610 -msgid "Failed" -msgstr "" - -#: /controllers/emailtemplates_controller.php:42 -#: /controllers/evaluations_controller.php:1928 -#: /controllers/users_controller.php:97 -#: /views/courses/view.ctp:11 -#: /views/elements/framework/view_user_detail.ctp:41 -#: /views/elements/searchs/instructor_search_panel.ctp:27 -#: /views/elements/users/ajax_user_list.ctp:29 -#: /views/users/edit_profile.ctp:26 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:43 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:107 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:11 +#: /Users/compass/projects/ipeer/src/views/elements/framework/view_user_detail.ctp:41 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/instructor_search_panel.ctp:27 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:29 +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:23 +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:8 msgid "Email" msgstr "" -#: /controllers/emailtemplates_controller.php:59 -#: /controllers/mixevals_controller.php:68 -#: /controllers/rubrics_controller.php:85 -#: /controllers/simpleevaluations_controller.php:95 -#: /controllers/surveys_controller.php:77 -#: /views/elements/searchs/instructor_search_panel.ctp:20 -#: /views/evaltools/index.ctp:4;26;52;78;96 -#: /views/evaluations/view_group_submission_details.ctp:46 -#: /views/mixevals/edit.ctp:38 -#: /views/rubrics/edit.ctp:15 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:60 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:77 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:85 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:93 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:75 +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:9 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:5 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/instructor_search_panel.ctp:20 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:4;26;52;78;100 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_group_submission_details.ctp:46 +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:19;27 +#: /Users/compass/projects/ipeer/src/views/mixevals/view.ctp:4 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:14 msgid "Name" msgstr "" -#: /controllers/emailtemplates_controller.php:61 -#: /controllers/simpleevaluations_controller.php:96 -#: /views/elements/email/html/addEvent.ctp:2 -#: /views/elements/email/text/addEvent.ctp:2 -#: /views/elements/evaluations/simple_eval_form.ctp:145 -#: /views/elements/evaluations/student_view_event_info.ctp:25 -#: /views/elements/evaluations/view_event_info.ctp:16 -#: /views/evaltools/index.ctp:98 -#: /views/evaluations/student_view_simple_evaluation_results.ctp:20 -#: /views/evaluations/view_simple_evaluation_results.ctp:20 -#: /views/events/view.ctp:16 -#: /views/simple_evaluations/view.ctp:12 -#: /views/sys_parameters/add.ctp:38 -#: /views/sys_parameters/edit.ctp:45 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:61 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:79 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:87 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:96 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:77 +#: /Users/compass/projects/ipeer/src/views/mixevals/view.ctp:6 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:35 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/edit.ctp:43 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/view.ctp:20 +#: /Users/compass/projects/ipeer/src/views/surveys/edit.ctp:23 +msgid "Availability" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:61 +msgid "public" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:61 +msgid "private" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:63 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:94 +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:723 +#: /Users/compass/projects/ipeer/src/views/elements/email/html/addEvent.ctp:2 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/addEvent.ctp:2 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:145 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_event_info.ctp:25 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/view_event_info.ctp:16 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:103 +#: /Users/compass/projects/ipeer/src/views/evaluations/mixeval_eval_form.ctp:4 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:20 +#: /Users/compass/projects/ipeer/src/views/evaluations/survey_eval_form.ctp:4 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:20 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:16 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/view.ctp:12 msgid "Description" msgstr "" -#: /controllers/emailtemplates_controller.php:63 -#: /controllers/groups_controller.php:64 -#: /controllers/mixevals_controller.php:75 -#: /controllers/rubrics_controller.php:93 -#: /controllers/simpleevaluations_controller.php:101 -#: /views/elements/creator_block.ctp:2 -#: /views/elements/framework/view_user_detail.ctp:54 -#: /views/surveys/view.ctp:8 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:65 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:88 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:85 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:94 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:100 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:81 +#: /Users/compass/projects/ipeer/src/views/elements/creator_block.ctp:2 +#: /Users/compass/projects/ipeer/src/views/elements/framework/view_user_detail.ctp:58 +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:25 +#: /Users/compass/projects/ipeer/src/views/surveys/view.ctp:8 msgid "Creator" msgstr "" -#: /controllers/emailtemplates_controller.php:72 -msgid "Email Template to show:" +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:74 +msgid "Email Templates to show:" msgstr "" -#: /controllers/emailtemplates_controller.php:124 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:122 msgid "Are you sure you want to delete this email template permanently?" msgstr "" -#: /controllers/emailtemplates_controller.php:127;354 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:125;314 msgid "View Email Template" msgstr "" -#: /controllers/emailtemplates_controller.php:128;236 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:126;222 msgid "Edit Email Template" msgstr "" -#: /controllers/emailtemplates_controller.php:129 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:127 msgid "Delete Email Template" msgstr "" -#: /controllers/emailtemplates_controller.php:163 -msgid "Error: You do not have permission to access email templates." -msgstr "" - -#: /controllers/emailtemplates_controller.php:184 -msgid "Error: You do not have permission to add email templates." -msgstr "" - -#: /controllers/emailtemplates_controller.php:188 -#: /views/email_templates/index.ctp:6 -#: /views/emailer/write.ctp:111 -#: /views/evaltools/index.ctp:157 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:176 +#: /Users/compass/projects/ipeer/src/views/email_templates/index.ctp:6 +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:111 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:174 msgid "Add Email Template" msgstr "" -#: /controllers/emailtemplates_controller.php:198 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:187 msgid "Save Successful!" msgstr "" -#: /controllers/emailtemplates_controller.php:200 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:190 msgid "Save failed." msgstr "" -#: /controllers/emailtemplates_controller.php:219 -msgid "Error: You do not have permission to edit email templates." -msgstr "" - -#: /controllers/emailtemplates_controller.php:225 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:211 msgid "Save Successful" msgstr "" -#: /controllers/emailtemplates_controller.php:228 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:214 msgid "Failed to save" msgstr "" -#: /controllers/emailtemplates_controller.php:239 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:225 msgid "Error:Invalid ID." msgstr "" -#: /controllers/emailtemplates_controller.php:267 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:247 msgid "Error: You do not have permission to edit this email template" msgstr "" -#: /controllers/emailtemplates_controller.php:288 -msgid "Error: You do not have permission to delete email templates." -msgstr "" - -#: /controllers/emailtemplates_controller.php:302;361 -#: /controllers/mixevals_controller.php:204;349;468 -#: /controllers/rubrics_controller.php:235;369;483;550 -#: /controllers/simpleevaluations_controller.php:238;358;445 -#: /controllers/surveys_controller.php:186;252;303;340 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:272;321 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:592;704 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:218;321;426;481 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:219;320;390 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:209;290;338;374 msgid "Error: Invalid ID." msgstr "" -#: /controllers/emailtemplates_controller.php:330 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:294 msgid "Error: You do not have permission to delete this email template" msgstr "" -#: /controllers/emailtemplates_controller.php:336 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:301 msgid "The Email Template was deleted successfully." msgstr "" -#: /controllers/emailtemplates_controller.php:338 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:303 msgid "Failed to delete the Email Template." msgstr "" -#: /controllers/emailtemplates_controller.php:350 -msgid "Error: You do not have permission to view email templates." -msgstr "" - -#: /controllers/emailtemplates_controller.php:390 +#: /Users/compass/projects/ipeer/src/controllers/emailtemplates_controller.php:344 msgid "Error: You do not have permission to vie this email template" msgstr "" -#: /controllers/evaltools_controller.php:33 +#: /Users/compass/projects/ipeer/src/controllers/evaltools_controller.php:33 msgid "Evaluation Tools" msgstr "" -#: /controllers/evaluations_controller.php:36 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:39 msgid "Evaluations" msgstr "" -#: /controllers/evaluations_controller.php:69;201;981 -#: /controllers/events_controller.php:71 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:72;211;1182 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:75 msgid "Results" msgstr "" -#: /controllers/evaluations_controller.php:79 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:82 msgid "Late" msgstr "" -#: /controllers/evaluations_controller.php:79 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:82 msgid "No Lates" msgstr "" -#: /controllers/evaluations_controller.php:111 -#: /controllers/groups_controller.php:61 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:114 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:85 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:513 msgid "Group #" msgstr "" -#: /controllers/evaluations_controller.php:112;1928 -#: /controllers/groups_controller.php:62 -#: /views/elements/events/event_groups_detail.ctp:5 -#: /views/evaluations/view_group_submission_details.ctp:5 -#: /views/groups/edit.ctp:15 -#: /views/groups/view.ctp:4 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:115 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:86;552 +#: /Users/compass/projects/ipeer/src/views/elements/events/event_groups_detail.ctp:5 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_group_submission_details.ctp:5 +#: /Users/compass/projects/ipeer/src/views/groups/edit.ctp:16 +#: /Users/compass/projects/ipeer/src/views/groups/view.ctp:4 msgid "Group Name" msgstr "" -#: /controllers/evaluations_controller.php:113 -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:47 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:116 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:47 msgid "Completed" msgstr "" -#: /controllers/evaluations_controller.php:114 -#: /controllers/events_controller.php:101;270 -#: /controllers/groups_controller.php:178 -#: /controllers/sysparameters_controller.php:71 -#: /views/departments/index.ctp:37 -#: /views/elements/evaluations/ajax_evaluation_list.ctp:45 -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:11;28 -#: /views/elements/survey_groups/ajax_survey_group_list.ctp:22 -#: /views/faculties/index.ctp:37 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:117 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:128;303 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:204 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:217 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:71 +#: /Users/compass/projects/ipeer/src/views/departments/index.ctp:37 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_list.ctp:45 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:11;28 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_group_list.ctp:22 +#: /Users/compass/projects/ipeer/src/views/faculties/index.ctp:37 msgid "View" msgstr "" -#: /controllers/evaluations_controller.php:115 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:118 msgid "Late?" msgstr "" -#: /controllers/evaluations_controller.php:119 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:122 msgid "Not Reviewed" msgstr "" -#: /controllers/evaluations_controller.php:120 -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:17 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:123 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:17 msgid "Reviewed" msgstr "" -#: /controllers/evaluations_controller.php:121 -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:258 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:124 +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:562 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_rubric_evaluation_results.ctp:103 msgid "Grade" msgstr "" -#: /controllers/evaluations_controller.php:122;124 -#: /views/elements/evaluations/student_view_event_info.ctp:42;53 -#: /views/evaluations/student_view_mixeval_evaluation_results.ctp:28 -#: /views/evaluations/student_view_rubric_evaluation_results.ctp:21 -#: /views/evaluations/student_view_simple_evaluation_results.ctp:45;55 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:125;127 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_event_info.ctp:42;53 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_mixeval_evaluation_results.ctp:35 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_rubric_evaluation_results.ctp:29 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:47;58 msgid "Not Released" msgstr "" -#: /controllers/evaluations_controller.php:122;124 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:125;127 msgid "Some Released" msgstr "" -#: /controllers/evaluations_controller.php:122;124 -#: /views/evaluations/view_simple_evaluation_results.ctp:294 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:125;127 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:290 msgid "Released" msgstr "" -#: /controllers/evaluations_controller.php:123 -#: /controllers/events_controller.php:112 -#: /views/elements/evaluations/simple_eval_form.ctp:186 -#: /views/elements/evaluations/student_view_mixeval_details.ctp:137 -#: /views/elements/evaluations/student_view_rubric_details.ctp:63 -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:304 -#: /views/evaluations/view_simple_evaluation_results.ctp:293 -#: /views/oauth_tokens/view.ctp:29 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:126 +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:563 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:188 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_rubric_details.ctp:46 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:290 msgid "Comment" msgstr "" -#: /controllers/evaluations_controller.php:138 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:141 msgid "View Results" msgstr "" -#: /controllers/evaluations_controller.php:139 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:142 msgid "View Submission" msgstr "" -#: /controllers/evaluations_controller.php:140 -#: /controllers/groups_controller.php:100 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:143 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:124 msgid "View Group" msgstr "" -#: /controllers/evaluations_controller.php:141 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:144 msgid "View Event" msgstr "" -#: /controllers/evaluations_controller.php:142 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:145 msgid "Edit Event" msgstr "" -#: /controllers/evaluations_controller.php:188;961;1153 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:191;1159;1325 msgid "Error: Invalid id or you do not have permission to access this event." msgstr "" -#: /controllers/evaluations_controller.php:229 -msgid "Error: You do not have permission to export evaluation results" -msgstr "" - -#: /controllers/evaluations_controller.php:238 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:244 msgid "Error: Invalid id" msgstr "" -#: /controllers/evaluations_controller.php:271;318;381;503;602;622;789;806;1108 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:283;342;408;549;666;945;963 msgid "Error: Invalid Id" msgstr "" -#: /controllers/evaluations_controller.php:280 -#: /views/elements/courses/ajax_personalize_Course.SubMenu.EvalResults.Show.ctp:10 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:293 +#: /Users/compass/projects/ipeer/src/views/elements/courses/ajax_personalize_Course.SubMenu.EvalResults.Show.ctp:10 msgid "Export Evaluation Results" msgstr "" -#: /controllers/evaluations_controller.php:389;630;814 -msgid "Error: Submissions had been made" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:300;1582 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:274;471;646 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:269;322;356;388;466 +msgid "Error: That event does not exist or you dont have access to it" msgstr "" -#: /controllers/evaluations_controller.php:399;640;825 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:417;676;974 msgid "Error: Evaluation is unavailable" msgstr "" -#: /controllers/evaluations_controller.php:421;665;840 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:450;700;996 msgid " > Evaluate Peers" msgstr "" -#: /controllers/evaluations_controller.php:467;763;935 -msgid "Your Evaluation was submitted successfully." +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:484 +msgid "One or more of your group members have negative points. Please use positive numbers." msgstr "" -#: /controllers/evaluations_controller.php:473;862 -msgid "Save Evaluation failure." +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:505;916;1104;1108 +msgid "Your Evaluation was submitted successfully." msgstr "" -#: /controllers/evaluations_controller.php:511 -msgid "Error: Survey has already been submitted" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:511 +msgid "Save Evaluation failure." msgstr "" -#: /controllers/evaluations_controller.php:522 +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:557 msgid "Error: Survey is unavailable" msgstr "" -#: /controllers/evaluations_controller.php:531 -msgid " > Survey" -msgstr "" - -#: /controllers/evaluations_controller.php:561 -msgid "Your survey was submitted successfully" -msgstr "" - -#: /controllers/evaluations_controller.php:564 -msgid "Your survey was not submitted successfully" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:567 +msgid "Error: Survey has already been submitted" msgstr "" -#: /controllers/evaluations_controller.php:678 -msgid "validRubricEvalCompleten failure" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:616 +msgid "Your survey was submitted successfully!" msgstr "" -#: /controllers/evaluations_controller.php:689 -msgid "Your evaluation was not saved successfully" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:621 +msgid "Survey save failed, please try again." msgstr "" -#: /controllers/evaluations_controller.php:970 -msgid "Error: Invalid group id." +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:629 +msgid " > Survey" msgstr "" -#: /controllers/evaluations_controller.php:1040 -msgid "'s Results " +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:767;819 +msgid "some comments are missing" msgstr "" -#: /controllers/evaluations_controller.php:1162 -msgid "Error: Invalid group id or you are not in this group." +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:770;822 +msgid "you still have to submit the evaluation with the Submit button below" msgstr "" -#: /controllers/evaluations_controller.php:1167 -msgid "Error: The results are not released." +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:773;825 +msgid "Your evaluation has been saved" msgstr "" -#: /controllers/evaluations_controller.php:1177 -msgid "View My Results" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:780;830 +msgid "Your evaluation was not saved successfully" msgstr "" -#: /controllers/evaluations_controller.php:1598 -msgid "Submission Details" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1085 +msgid "Error: Unable to submit the evaluation. Please try again." msgstr "" -#: /controllers/evaluations_controller.php:1665 -msgid "Error: Invalid event Id" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1102 +msgid "Error" msgstr "" -#: /controllers/evaluations_controller.php:1678 -msgid "Error: Invalid survey Id" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1113 +msgid "Your answers have been saved. Please answer all the required questions before it can be considered submitted." msgstr "" -#: /controllers/evaluations_controller.php:1692 -#: /views/elements/evaluations/summary_info.ctp:1 -#: /views/evaluations/student_view_mixeval_evaluation_results.ctp:9 -#: /views/evaluations/student_view_rubric_evaluation_results.ctp:3 -#: /views/evaluations/student_view_simple_evaluation_results.ctp:27 -#: /views/evaluations/view_simple_evaluation_results.ctp:27 -msgid "Summary" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1119 +msgid "Error: It was unsuccessful to save evaluation(s) for " msgstr "" -#: /controllers/evaluations_controller.php:1827 -msgid "N/A" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1169 +msgid "Error: Invalid group id." msgstr "" -#: /controllers/evaluations_controller.php:1928 -#: /views/evaluations/view_group_submission_details.ctp:4 -#: /views/groups/edit.ctp:14 -#: /views/groups/view.ctp:3 -msgid "Group Number" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1336 +msgid "Error: Invalid group id or you are not in this group." msgstr "" -#: /controllers/evaluations_controller.php:1928 -#: /views/elements/framework/view_user_detail.ctp:20 -#: /views/elements/users/ajax_user_list.ctp:27 -#: /views/elements/users/user_summary_list.ctp:6 -#: /views/users/edit_profile.ctp:14 -msgid "First Name" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1342 +msgid "Error: The results are not released." msgstr "" -#: /controllers/evaluations_controller.php:1928 -#: /views/elements/framework/view_user_detail.ctp:14 -#: /views/elements/users/ajax_user_list.ctp:28 -#: /views/elements/users/user_summary_list.ctp:7 -#: /views/users/edit_profile.ctp:20 -msgid "Last Name" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1355 +msgid "View My Results" msgstr "" -#: /controllers/evaluations_controller.php:1928 -#: /views/evaluations/view_group_submission_details.ctp:47 -#: /views/users/edit_profile.ctp:33 -msgid "Student Number" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1788 +msgid "Submission Details" msgstr "" -#: /controllers/evaluations_controller.php:1928 -#: /views/elements/rubrics/ajax_rubric_view.ctp:70 -msgid "General Comments" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1849 +msgid "Error: Invalid event Id" msgstr "" -#: /controllers/evaluations_controller.php:1928 -msgid "Score" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1855 +msgid "Error: There are no students in the class" msgstr "" -#: /controllers/evaluations_controller.php:1928 -msgid "Specific Comments" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1863 +msgid "Error: Invalid survey Id" msgstr "" -#: /controllers/evaluations_controller.php:1968 -msgid "Location:" +#: /Users/compass/projects/ipeer/src/controllers/evaluations_controller.php:1887 +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:60 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/summary_info.ctp:1 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_mixeval_evaluation_results.ctp:10 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_rubric_evaluation_results.ctp:3 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:27 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results.ctp:14 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:26 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results.ctp:4 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:13 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:27 +msgid "Summary" msgstr "" -#: /controllers/events_controller.php:27;210 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:29;244 msgid "Events" msgstr "" -#: /controllers/events_controller.php:60 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:64 msgid "Not Yet Open" msgstr "" -#: /controllers/events_controller.php:62 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:66 msgid "Already Closed" msgstr "" -#: /controllers/events_controller.php:64 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:68 msgid "Open Now" msgstr "" -#: /controllers/events_controller.php:102 -#: /controllers/sysparameters_controller.php:61 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:129 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:152 +#: /Users/compass/projects/ipeer/src/views/courses/home.ctp:55 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:20 +msgid "Groups" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:130 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:61 msgid "Type" msgstr "" -#: /controllers/events_controller.php:104 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:132 msgid "Simple" msgstr "" -#: /controllers/events_controller.php:105 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:133 msgid "Rubric" msgstr "" -#: /controllers/events_controller.php:106 -#: /controllers/surveygroups_controller.php:64 -#: /views/elements/surveys/ajax_survey_validate.ctp:4 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:134 +#: /Users/compass/projects/ipeer/src/views/elements/surveys/ajax_survey_validate.ctp:4 msgid "Survey" msgstr "" -#: /controllers/events_controller.php:107 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:135 msgid "Mixed" msgstr "" -#: /controllers/events_controller.php:108 -#: /views/elements/evaluations/ajax_evaluation_list.ctp:28 -#: /views/elements/evaluations/simple_eval_form.ctp:141 -#: /views/elements/evaluations/student_view_event_info.ctp:21 -#: /views/elements/evaluations/view_event_info.ctp:12 -#: /views/elements/events/ajax_event_list.ctp:17 -#: /views/elements/searchs/evaluation_search_panel.ctp:27 -#: /views/evaluations/student_view_simple_evaluation_results.ctp:7 -#: /views/evaluations/view_simple_evaluation_results.ctp:7 -#: /views/events/view.ctp:42 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:136 +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:722 +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:10 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:6 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_list.ctp:28 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:141 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_event_info.ctp:21 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/view_event_info.ctp:12 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:17 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_search_panel.ctp:27 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:7 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:7 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:54 msgid "Due Date" msgstr "" -#: /controllers/events_controller.php:109 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:137 msgid "Released ?" msgstr "" -#: /controllers/events_controller.php:110 -msgid "Self Eval" -msgstr "" - -#: /controllers/events_controller.php:111 -msgid "Disabled" -msgstr "" - -#: /controllers/events_controller.php:111 -msgid "Enabled" -msgstr "" - -#: /controllers/events_controller.php:113 -#: /views/evaluations/rubric_eval_form.ctp:39 -msgid "Optional" -msgstr "" - -#: /controllers/events_controller.php:113 -msgid "Required" +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:138 +msgid "Result Released" msgstr "" -#: /controllers/events_controller.php:126;136 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:154;164 msgid "for Course:" msgstr "" -#: /controllers/events_controller.php:157 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:189 msgid "Are you sure you want to delete this event permanently?" msgstr "" -#: /controllers/events_controller.php:240;356;458 -msgid "Error: That event does not exist or you dont have access to it" -msgstr "" - -#: /controllers/events_controller.php:293 -#: /views/events/index.ctp:4 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:326 +#: /Users/compass/projects/ipeer/src/views/events/index.ctp:5 msgid "Add Event" msgstr "" -#: /controllers/events_controller.php:441 -#: /controllers/groups_controller.php:274 -#: /controllers/sysparameters_controller.php:72 -#: /views/departments/index.ctp:43 -#: /views/elements/survey_groups/ajax_survey_group_list.ctp:24 -#: /views/faculties/index.ctp:43 -#: /views/simple_evaluations/delete.ctp:1 -#: /views/sys_parameters/delete.ctp:1 -#: /views/sys_parameters/edit.ctp:8 -#: /views/users/delete.ctp:1 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:573 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:302 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:72 +#: /Users/compass/projects/ipeer/src/views/departments/index.ctp:43 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_group_list.ctp:24 +#: /Users/compass/projects/ipeer/src/views/faculties/index.ctp:43 +#: /Users/compass/projects/ipeer/src/views/surveys/questionssummary.ctp:31 msgid "Edit" msgstr "" -#: /controllers/events_controller.php:470 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:658 msgid "The event has been deleted successfully." msgstr "" -#: /controllers/events_controller.php:474 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:662 msgid "Failed to delete the event" msgstr "" -#: /controllers/faculties_controller.php:45;116 +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:692 +msgid "Event title \"" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/events_controller.php:692 +msgid "\" already exists in this course." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/faculties_controller.php:41;114 msgid "Invalid faculty" msgstr "" -#: /controllers/faculties_controller.php:101 +#: /Users/compass/projects/ipeer/src/controllers/faculties_controller.php:99 msgid "Faculty added!" msgstr "" -#: /controllers/faculties_controller.php:104;124 +#: /Users/compass/projects/ipeer/src/controllers/faculties_controller.php:102;123 msgid "The faculty could not be saved. Please, try again." msgstr "" -#: /controllers/faculties_controller.php:121 +#: /Users/compass/projects/ipeer/src/controllers/faculties_controller.php:120 msgid "Faculty saved." msgstr "" -#: /controllers/faculties_controller.php:139 +#: /Users/compass/projects/ipeer/src/controllers/faculties_controller.php:138 msgid "Invalid id for faculty" msgstr "" -#: /controllers/faculties_controller.php:143 +#: /Users/compass/projects/ipeer/src/controllers/faculties_controller.php:142 msgid "Faculty deleted" msgstr "" -#: /controllers/faculties_controller.php:146 +#: /Users/compass/projects/ipeer/src/controllers/faculties_controller.php:145 msgid "Faculty was not deleted" msgstr "" -#: /controllers/framework_controller.php:32 +#: /Users/compass/projects/ipeer/src/controllers/framework_controller.php:32 msgid "Framework" msgstr "" -#: /controllers/framework_controller.php:68 -#: /controllers/users_controller.php:310 -msgid "Error: You do not have permission to view users" -msgstr "" - -#: /controllers/framework_controller.php:73 -msgid "Error: Invalid user ID." -msgstr "" - -#: /controllers/framework_controller.php:79;99 -#: /controllers/users_controller.php:321;342 -msgid "Error: You do not have permission to view this user" -msgstr "" - -#: /controllers/framework_controller.php:104 -#: /controllers/users_controller.php:126;347 -msgid "View User" -msgstr "" - -#: /controllers/groups_controller.php:65 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:89 msgid "Date" msgstr "" -#: /controllers/groups_controller.php:91 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:115 msgid "Delete this group?\n" msgstr "" -#: /controllers/groups_controller.php:92 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:116 msgid "(The students themselves will be unaffected).\n" msgstr "" -#: /controllers/groups_controller.php:93 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:117 msgid "Proceed?" msgstr "" -#: /controllers/groups_controller.php:101 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:125 msgid "Edit Group" msgstr "" -#: /controllers/groups_controller.php:103 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:127 msgid "View Course" msgstr "" -#: /controllers/groups_controller.php:105 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:129 msgid "Delete Group" msgstr "" -#: /controllers/groups_controller.php:128 -#: /views/courses/home.ctp:41 -#: /views/elements/events/ajax_event_list.ctp:20 -msgid "Groups" -msgstr "" - -#: /controllers/groups_controller.php:165;242;299 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:189;269;327 msgid "Error: That group does not exist." msgstr "" -#: /controllers/groups_controller.php:201 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:228 msgid "The group was added successfully." msgstr "" -#: /controllers/groups_controller.php:219 -#: /views/groups/index.ctp:4 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:246 +#: /Users/compass/projects/ipeer/src/views/groups/index.ctp:5 msgid "Add Group" msgstr "" -#: /controllers/groups_controller.php:256 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:284 msgid "The group was updated successfully." msgstr "" -#: /controllers/groups_controller.php:258 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:286 msgid "Error updating that group." msgstr "" -#: /controllers/groups_controller.php:312 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:340 msgid "The group was deleted successfully." msgstr "" -#: /controllers/groups_controller.php:314 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:342 msgid "Group delete failed." msgstr "" -#: /controllers/groups_controller.php:343 -msgid "File required." +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:376 +#: /Users/compass/projects/ipeer/src/plugins/file_upload/controllers/components/file_upload.php:184 +msgid "Please select a file to upload." msgstr "" -#: /controllers/groups_controller.php:372 +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:398 msgid "Import Groups From Text (.txt) or CSV File (.csv)" msgstr "" -#: /controllers/groups_controller.php:425 -msgid "Too few columns in this line (" -msgstr "" - -#: /controllers/groups_controller.php:426;429 -msgid " expected 3." -msgstr "" - -#: /controllers/groups_controller.php:428 -msgid "Too many columns in this line (" -msgstr "" - -#: /controllers/groups_controller.php:438 -msgid "Username column is empty." -msgstr "" - -#: /controllers/groups_controller.php:440 -msgid "Group Number column is empty." -msgstr "" - -#: /controllers/groups_controller.php:442 -msgid "Group Name column is empty." -msgstr "" - -#: /controllers/groups_controller.php:446;461;559;571 -#: /views/elements/email/text/addUser.ctp:2 -msgid "User " -msgstr "" - -#: /controllers/groups_controller.php:446 -msgid " is unknown. Please add this user first." -msgstr "" - -#: /controllers/groups_controller.php:461 -msgid " is not enrolled in your selected course. " -msgstr "" - -#: /controllers/groups_controller.php:462 -msgid "Please enrol them first." -msgstr "" - -#: /controllers/groups_controller.php:465 -msgid "Validated Entry" -msgstr "" - -#: /controllers/groups_controller.php:496 -msgid "Unchecked groups" -msgstr "" - -#: /controllers/groups_controller.php:513 -msgid "The group already exists. Students will be added to it." -msgstr "" - -#: /controllers/groups_controller.php:530 -msgid "This is a new group; it was created successfully." -msgstr "" - -#: /controllers/groups_controller.php:532 -msgid "The group could not be created in the database!" -msgstr "" - -#: /controllers/groups_controller.php:559 -msgid " is already in group " +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:511 +msgid "Import Groups Results" msgstr "" -#: /controllers/groups_controller.php:567 -msgid "User added successfully to group " +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:532 +msgid "Export Groups" msgstr "" -#: /controllers/groups_controller.php:571 -msgid " could not be added to group " +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:551 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_group_submission_details.ctp:4 +#: /Users/compass/projects/ipeer/src/views/groups/edit.ctp:15 +#: /Users/compass/projects/ipeer/src/views/groups/view.ctp:3 +msgid "Group Number" msgstr "" -#: /controllers/groups_controller.php:573 -msgid "- the entry could not be created in the database." +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:556 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:514 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:91;1118 +#: /Users/compass/projects/ipeer/src/views/elements/email/html/resetPassword.ctp:3 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/addUser.ctp:4 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/resetPassword.ctp:4 +#: /Users/compass/projects/ipeer/src/views/elements/framework/view_user_detail.ctp:3 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:25 +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:16 +#: /Users/compass/projects/ipeer/src/views/elements/users/user_summary_list.ctp:5 +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:5 +msgid "Username" msgstr "" -#: /controllers/groups_controller.php:578 -msgid "Can't find the group for user" +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:557 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:515 +msgid "Student No" msgstr "" -#: /controllers/groups_controller.php:579 -msgid "This should never occur!" +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:558 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:516 +#: /Users/compass/projects/ipeer/src/views/elements/framework/view_user_detail.ctp:20 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:27 +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:19 +#: /Users/compass/projects/ipeer/src/views/elements/users/user_summary_list.ctp:6 +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:6 +msgid "First Name" msgstr "" -#: /controllers/groups_controller.php:654 -msgid "Export Groups" +#: /Users/compass/projects/ipeer/src/controllers/groups_controller.php:559 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:517 +#: /Users/compass/projects/ipeer/src/views/elements/framework/view_user_detail.ctp:14 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:28 +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:18 +#: /Users/compass/projects/ipeer/src/views/elements/users/user_summary_list.ctp:7 +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:7 +msgid "Last Name" msgstr "" -#: /controllers/home_controller.php:30 +#: /Users/compass/projects/ipeer/src/controllers/home_controller.php:30 msgid "Home" msgstr "" -#: /controllers/home_controller.php:118 +#: /Users/compass/projects/ipeer/src/controllers/home_controller.php:125 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1581 msgid " days" msgstr "" -#: /controllers/home_controller.php:123 +#: /Users/compass/projects/ipeer/src/controllers/home_controller.php:130 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1585 msgid " minutes " msgstr "" -#: /controllers/home_controller.php:124 +#: /Users/compass/projects/ipeer/src/controllers/home_controller.php:131 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1585 msgid " seconds" msgstr "" -#: /controllers/home_controller.php:129 +#: /Users/compass/projects/ipeer/src/controllers/home_controller.php:136 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1589 msgid " hours " msgstr "" -#: /controllers/home_controller.php:130 +#: /Users/compass/projects/ipeer/src/controllers/home_controller.php:137 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1589 msgid " minutes" msgstr "" -#: /controllers/install_controller.php:37 +#: /Users/compass/projects/ipeer/src/controllers/install_controller.php:37 msgid "Installation Wizard" msgstr "" -#: /controllers/install_controller.php:47 -msgid "WARNING: It looks like you already have a instance running. Reinstalling will remove all your current data. Remove app/config/installed.txt to proceed." +#: /Users/compass/projects/ipeer/src/controllers/install_controller.php:59 +msgid "WARNING: It looks like you already have a instance running. Reinstalling will remove all your current data. Remove %s to proceed." msgstr "" -#: /controllers/install_controller.php:80 +#: /Users/compass/projects/ipeer/src/controllers/install_controller.php:92 msgid "Cannot write to the database configuration file. Please change the permission on %s so that it is writable." msgstr "" -#: /controllers/install_controller.php:89;132 +#: /Users/compass/projects/ipeer/src/controllers/install_controller.php:101;146 msgid "Please fill in all fields." msgstr "" -#: /controllers/install_controller.php:98 +#: /Users/compass/projects/ipeer/src/controllers/install_controller.php:110 msgid "Database config failed - %s" msgstr "" -#: /controllers/install_controller.php:115 -#: /libs/upgrade_scripts/upgrade_300.php:47 +#: /Users/compass/projects/ipeer/src/controllers/install_controller.php:127 +#: /Users/compass/projects/ipeer/src/libs/upgrade_scripts/upgrade_300.php:58 msgid "Cannot write to the configuration directory. Please change the permission on %s so that it is writable." msgstr "" -#: /controllers/install_controller.php:121 -#: /libs/upgrade_scripts/upgrade_300.php:53 +#: /Users/compass/projects/ipeer/src/controllers/install_controller.php:133 +#: /Users/compass/projects/ipeer/src/libs/upgrade_scripts/upgrade_300.php:64 msgid "Cannot copy the guard configuration (gurad.php) to the configuration directory." msgstr "" -#: /controllers/install_controller.php:158 -#: /libs/upgrade_scripts/upgrade_300.php:70 +#: /Users/compass/projects/ipeer/src/controllers/install_controller.php:174 +#: /Users/compass/projects/ipeer/src/libs/upgrade_scripts/upgrade_300.php:85 msgid "Installation failed, unable to write to %s dir" msgstr "" -#: /controllers/mixevals_controller.php:27 -#: /views/evaltools/index.ctp:136 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:29 msgid "Mixed Evaluations" msgstr "" -#: /controllers/mixevals_controller.php:50 -#: /controllers/rubrics_controller.php:64 -#: /controllers/surveys_controller.php:51 -#: /views/elements/evaluations/student_view_event_info.ctp:12 -#: /views/install/index.ctp:14 -#: /views/surveys/add_question.ctp:24 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:59 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:64 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:54 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_event_info.ctp:12 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:14 msgid "Yes" msgstr "" -#: /controllers/mixevals_controller.php:50 -#: /controllers/rubrics_controller.php:64 -#: /controllers/surveys_controller.php:51 -#: /views/elements/evaluations/student_view_event_info.ctp:14 -#: /views/install/index.ctp:13 -#: /views/surveys/add_question.ctp:24 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:59 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:64 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:54 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_event_info.ctp:14 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:13 msgid "No" msgstr "" -#: /controllers/mixevals_controller.php:69 -#: /controllers/rubrics_controller.php:86 -#: /controllers/simpleevaluations_controller.php:97 -#: /controllers/surveys_controller.php:79 -#: /views/evaltools/index.ctp:5;27;53;79 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:78 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:86 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:95 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:76 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:5;27;53;79 msgid "In Use" msgstr "" -#: /controllers/mixevals_controller.php:70 -#: /controllers/rubrics_controller.php:87 -#: /controllers/simpleevaluations_controller.php:98 -#: /views/mixevals/edit.ctp:44 -#: /views/rubrics/edit.ctp:36 -#: /views/simple_evaluations/edit.ctp:54 -#: /views/simple_evaluations/view.ctp:20 -msgid "Availability" +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:81 +#: /Users/compass/projects/ipeer/src/views/elements/mixevals/questions_editor.ctp:216 +msgid "Peer Evaluation Questions" msgstr "" -#: /controllers/mixevals_controller.php:71 -#: /controllers/surveys_controller.php:78 -#: /views/evaltools/index.ctp:80 -msgid "Questions" +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:82 +msgid "Self Evaluation Questions" msgstr "" -#: /controllers/mixevals_controller.php:72 -#: /views/elements/rubrics/ajax_rubric_edit.ctp:77 -#: /views/elements/rubrics/ajax_rubric_view.ctp:68 -#: /views/evaltools/index.ctp:31;57 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:83 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_edit.ctp:80 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_view.ctp:75 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:31;56 +#: /Users/compass/projects/ipeer/src/views/mixevals/view.ctp:68 msgid "Total Marks" msgstr "" -#: /controllers/mixevals_controller.php:85 -#: /controllers/rubrics_controller.php:103 -#: /controllers/simpleevaluations_controller.php:110 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:95 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:106 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:109 msgid "Evaluations to show:" msgstr "" -#: /controllers/mixevals_controller.php:138 -#: /controllers/simpleevaluations_controller.php:163 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:153 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:160 msgid "Are you sure you want to delete this evaluation permanently?" msgstr "" -#: /controllers/mixevals_controller.php:140 -#: /controllers/simpleevaluations_controller.php:165 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:155 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:162 msgid "View Evaluation" msgstr "" -#: /controllers/mixevals_controller.php:141 -#: /controllers/simpleevaluations_controller.php:166 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:156 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:163 msgid "Edit Evaluation" msgstr "" -#: /controllers/mixevals_controller.php:142 -#: /controllers/simpleevaluations_controller.php:167 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:157 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:164 msgid "Copy Evaluation" msgstr "" -#: /controllers/mixevals_controller.php:143 -#: /controllers/simpleevaluations_controller.php:168 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:158 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:165 msgid "Delete Evaluation" msgstr "" -#: /controllers/mixevals_controller.php:234 -#: /controllers/simpleevaluations_controller.php:267 -msgid "Error: You do not have permission to view this evaluation" -msgstr "" - -#: /controllers/mixevals_controller.php:247 -msgid "View Mixed Evaluation" +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:215 +msgid "Error: Invalid Mixeval ID." msgstr "" -#: /controllers/mixevals_controller.php:279 -msgid "The Mixed Evaluation was added successfully." +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:243 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:242 +msgid "Error: You do not have permission to view this evaluation" msgstr "" -#: /controllers/mixevals_controller.php:287 -#: /views/evaltools/index.ctp:137 -msgid "Add Mixed Evaluation" +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:276;582 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:342 +msgid "Error: You do not have permission to edit this evaluation" msgstr "" -#: /controllers/mixevals_controller.php:332 -msgid "Error: You do not have permission to edit mixed evaluations" +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:404 +msgid "Unable to save, please check below for error messages." msgstr "" -#: /controllers/mixevals_controller.php:376 -#: /controllers/simpleevaluations_controller.php:386 -msgid "Error: You do not have permission to edit this evaluation" +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:489 +msgid "Unable to save the mixed evaluation." msgstr "" -#: /controllers/mixevals_controller.php:389 -#: /controllers/rubrics_controller.php:409 -#: /controllers/simpleevaluations_controller.php:399 -#: /controllers/surveys_controller.php:264;353 -msgid "Submissions had been made. %s cannot be edited. Please make a copy." +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:505 +msgid "Unable to save this mixed eval's questions." msgstr "" -#: /controllers/mixevals_controller.php:406 -msgid "The Mixed Evaluation was edited successfully." +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:530 +msgid "Unable to save the mixed eval question descs." msgstr "" -#: /controllers/mixevals_controller.php:415 -#: /views/mixevals/edit.ctp:64 -msgid "Edit Mixed Evaluation" +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:541 +msgid "The mixed evaluation was saved successfully." msgstr "" -#: /controllers/mixevals_controller.php:454 -msgid "Error: You do not have permission to copy mixed evaluations" +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:613 +msgid "%s cannot be edited now that submissions have been made. Please make a copy." msgstr "" -#: /controllers/mixevals_controller.php:496 -#: /controllers/simpleevaluations_controller.php:474 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:726 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:413 msgid "Error: You do not have permission to copy this evaluation" msgstr "" -#: /controllers/mixevals_controller.php:503 -msgid "Copy Mixed Evaluation" +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:737 +#: /Users/compass/projects/ipeer/src/models/rubric.php:255 +msgid "Copy of " msgstr "" -#: /controllers/mixevals_controller.php:519 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:774 msgid "You do not have permission to delete mixed evaluations" msgstr "" -#: /controllers/mixevals_controller.php:564 -#: /controllers/simpleevaluations_controller.php:542 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:809 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:469 msgid "Error: You do not have permission to delete this evaluation" msgstr "" -#: /controllers/mixevals_controller.php:577 -#: /controllers/simpleevaluations_controller.php:549 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:822 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:477 msgid "This evaluation is now in use, and can NOT be deleted.
" msgstr "" -#: /controllers/mixevals_controller.php:578 -#: /controllers/simpleevaluations_controller.php:550 -msgid "Please remove all the events assosiated with this evaluation first." +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:823 +msgid "Please remove all the events associated with this evaluation first." msgstr "" -#: /controllers/mixevals_controller.php:589 +#: /Users/compass/projects/ipeer/src/controllers/mixevals_controller.php:829 msgid "The Mixed Evaluation was removed successfully." msgstr "" -#: /controllers/oauthclients_controller.php:54 +#: /Users/compass/projects/ipeer/src/controllers/oauthclients_controller.php:54 msgid "A new OAuth client has been created" msgstr "" -#: /controllers/oauthclients_controller.php:61;114 +#: /Users/compass/projects/ipeer/src/controllers/oauthclients_controller.php:61;114 msgid "The OAuth client could not be saved. Please, try again." msgstr "" -#: /controllers/oauthclients_controller.php:83 +#: /Users/compass/projects/ipeer/src/controllers/oauthclients_controller.php:83 msgid "Error: You do not have permission to create more than one OAuth Client Credential" msgstr "" -#: /controllers/oauthclients_controller.php:103 +#: /Users/compass/projects/ipeer/src/controllers/oauthclients_controller.php:103 msgid "Invalid OAuth client" msgstr "" -#: /controllers/oauthclients_controller.php:111 +#: /Users/compass/projects/ipeer/src/controllers/oauthclients_controller.php:111 msgid "The OAuth client has been saved" msgstr "" -#: /controllers/oauthclients_controller.php:139;142 +#: /Users/compass/projects/ipeer/src/controllers/oauthclients_controller.php:138;141 msgid "Invalid id for OAuth client" msgstr "" -#: /controllers/oauthclients_controller.php:144 +#: /Users/compass/projects/ipeer/src/controllers/oauthclients_controller.php:143 msgid "OAuth client deleted" msgstr "" -#: /controllers/oauthclients_controller.php:146 +#: /Users/compass/projects/ipeer/src/controllers/oauthclients_controller.php:145 msgid "OAuth client was not deleted" msgstr "" -#: /controllers/oauthtokens_controller.php:61 +#: /Users/compass/projects/ipeer/src/controllers/oauthtokens_controller.php:61 msgid "New OAuth token created!" msgstr "" -#: /controllers/oauthtokens_controller.php:68;108 +#: /Users/compass/projects/ipeer/src/controllers/oauthtokens_controller.php:68;109 msgid "The OAuth token could not be saved. Please, try again." msgstr "" -#: /controllers/oauthtokens_controller.php:97 +#: /Users/compass/projects/ipeer/src/controllers/oauthtokens_controller.php:98 msgid "Invalid oauth token" msgstr "" -#: /controllers/oauthtokens_controller.php:105 +#: /Users/compass/projects/ipeer/src/controllers/oauthtokens_controller.php:106 msgid "OAuth token saved successfully!" msgstr "" -#: /controllers/oauthtokens_controller.php:132;135 +#: /Users/compass/projects/ipeer/src/controllers/oauthtokens_controller.php:134;137 msgid "Invalid id for OAuth token" msgstr "" -#: /controllers/oauthtokens_controller.php:137 +#: /Users/compass/projects/ipeer/src/controllers/oauthtokens_controller.php:139 msgid "OAuth token deleted." msgstr "" -#: /controllers/oauthtokens_controller.php:144 +#: /Users/compass/projects/ipeer/src/controllers/oauthtokens_controller.php:146 msgid "OAuth token was not deleted." msgstr "" -#: /controllers/rubrics_controller.php:42 -#: /views/evaltools/index.ctp:126 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:42 msgid "Rubrics" msgstr "" -#: /controllers/rubrics_controller.php:88 -#: /views/evaltools/index.ctp:29 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:89 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:29 msgid "LOM" msgstr "" -#: /controllers/rubrics_controller.php:89 -#: /views/elements/rubrics/ajax_rubric_edit.ctp:40 -#: /views/evaltools/index.ctp:30 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:90 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_edit.ctp:40 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:30 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_rubric_evaluation_results.ctp:102 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:50 msgid "Criteria" msgstr "" -#: /controllers/rubrics_controller.php:90 -#: /views/evaluations/view_rubric_evaluation_results.ctp:9 -#: /views/evaluations/view_simple_evaluation_results.ctp:99 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:91 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results.ctp:38 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:132 +#: /Users/compass/projects/ipeer/src/views/helpers/evaluation.php:62;157 msgid "Total" msgstr "" -#: /controllers/rubrics_controller.php:157 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:96 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:51 +msgid "View Mode" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:157 msgid "Are you sure you want to delete this Rubric permanently?" msgstr "" -#: /controllers/rubrics_controller.php:159;279 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:159;253 msgid "View Rubric" msgstr "" -#: /controllers/rubrics_controller.php:160;429 -#: /views/rubrics/edit.ctp:56 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:160;385 msgid "Edit Rubric" msgstr "" -#: /controllers/rubrics_controller.php:161;519 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:161;457 msgid "Copy Rubric" msgstr "" -#: /controllers/rubrics_controller.php:162 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:162 msgid "Delete Rubric" msgstr "" -#: /controllers/rubrics_controller.php:184 -msgid "Error: You do not have permission to access rubrics" -msgstr "" - -#: /controllers/rubrics_controller.php:221 -msgid "Error: You do not have permission to view rubrics" -msgstr "" - -#: /controllers/rubrics_controller.php:264 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:241 msgid "Error: You do not have permission to view this rubric" msgstr "" -#: /controllers/rubrics_controller.php:295 -msgid "Error: You do not have permission to add rubrics" -msgstr "" - -#: /controllers/rubrics_controller.php:304 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:276 msgid "Add Rubric (Step 2)" msgstr "" -#: /controllers/rubrics_controller.php:309 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:288 msgid "The rubric was added successfully." msgstr "" -#: /controllers/rubrics_controller.php:314 -#: /views/elements/courses/ajax_personalize_Course.SubMenu.Rubric.Show.ctp:6 -#: /views/evaltools/index.ctp:127 -#: /views/rubrics/index.ctp:5 -msgid "Add Rubric" +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:293 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:277 +msgid "The evaluation was not added successfully." msgstr "" -#: /controllers/rubrics_controller.php:352 -msgid "Error: You do not have permission to edit rubrics" +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:301 +#: /Users/compass/projects/ipeer/src/views/elements/courses/ajax_personalize_Course.SubMenu.Rubric.Show.ctp:6 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:138 +#: /Users/compass/projects/ipeer/src/views/rubrics/index.ctp:5 +msgid "Add Rubric" msgstr "" -#: /controllers/rubrics_controller.php:396 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:342 msgid "Error: You do not have permission to edit this rubric" msgstr "" -#: /controllers/rubrics_controller.php:424 -msgid "The rubric evaluation was updated successfully" +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:350 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:351 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:381 +msgid "Submissions had been made. %s cannot be edited. Please make a copy." msgstr "" -#: /controllers/rubrics_controller.php:469 -msgid "Error: You do not have permission to copy rubrics." +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:367 +msgid "The rubric evaluation was updated successfully" msgstr "" -#: /controllers/rubrics_controller.php:512 -msgid "Error: You do not have permission to copy this rubric" +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:372 +msgid "The evaluation was not updated successfully." msgstr "" -#: /controllers/rubrics_controller.php:535 -msgid "Error: You do not have permission to delete rubrics" +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:449 +msgid "Error: You do not have permission to copy this rubric" msgstr "" -#: /controllers/rubrics_controller.php:578 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:503 msgid "Error: You do not have permission to delete this rubric" msgstr "" -#: /controllers/rubrics_controller.php:585 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:511 msgid "This evaluation is in use. Please remove all the events assosiated with this evaluation first." msgstr "" -#: /controllers/rubrics_controller.php:594 +#: /Users/compass/projects/ipeer/src/controllers/rubrics_controller.php:515 msgid "The rubric was deleted successfully." msgstr "" -#: /controllers/searchs_controller.php:50 +#: /Users/compass/projects/ipeer/src/controllers/searchs_controller.php:50 msgid "Advanced Search" msgstr "" -#: /controllers/simpleevaluations_controller.php:48 -#: /views/evaltools/index.ctp:116 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:46 msgid "Simple Evaluations" msgstr "" -#: /controllers/simpleevaluations_controller.php:99 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:98 msgid "Points/Member" msgstr "" -#: /controllers/simpleevaluations_controller.php:189 -msgid "Error: You do not have permission to access simple evaluations." -msgstr "" - -#: /controllers/simpleevaluations_controller.php:224 -msgid "Error: You do not have permission to view simple evaluations." -msgstr "" - -#: /controllers/simpleevaluations_controller.php:295 -msgid "Error: You do not have permission to add simple evaluations." -msgstr "" - -#: /controllers/simpleevaluations_controller.php:301 -msgid "Simple Evaluations > Add Template" -msgstr "" - -#: /controllers/simpleevaluations_controller.php:304 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:273 msgid "The evaluation was added successfully." msgstr "" -#: /controllers/simpleevaluations_controller.php:307 -msgid "The evaluation was not added successfully." -msgstr "" - -#: /controllers/simpleevaluations_controller.php:406 +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:359 msgid "The simple evaluation was updated successfully." msgstr "" -#: /controllers/simpleevaluations_controller.php:417 -msgid "Simple Evaluations > Edit Template" +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:478 +msgid "Please remove all the events assosiated with this evaluation first." msgstr "" -#: /controllers/simpleevaluations_controller.php:431 -msgid "Error: You do not have permission to copy simple evaluations." +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:484 +msgid "The evaluation was deleted successfully." msgstr "" -#: /controllers/simpleevaluations_controller.php:499 -msgid "You do not have permission to delete simple evaluations" +#: /Users/compass/projects/ipeer/src/controllers/simpleevaluations_controller.php:486 +msgid "Evaluation delete failed." msgstr "" -#: /controllers/simpleevaluations_controller.php:560 -msgid "The evaluation was deleted successfully." +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:27;111 +msgid "Survey Groups" msgstr "" -#: /controllers/simpleevaluations_controller.php:562 -msgid "Evaluation delete failed." +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:65 +#: /Users/compass/projects/ipeer/src/views/elements/email/html/addEvent.ctp:1 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:13 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_result_search_panel.ctp:21 +msgid "Event" msgstr "" -#: /controllers/surveygroups_controller.php:26;102 -msgid "Survey Groups" +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:66 +msgid "Group Set Name" msgstr "" -#: /controllers/surveygroups_controller.php:65 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:67 msgid "Number of Groups" msgstr "" -#: /controllers/surveygroups_controller.php:66 -#: /views/elements/events/ajax_event_list.ctp:18 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:68 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:18 msgid "Released?" msgstr "" -#: /controllers/surveygroups_controller.php:72 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:75 msgid "Are you sure you want to delete this group set permanently?" msgstr "" -#: /controllers/surveygroups_controller.php:74 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:77 msgid "Release" msgstr "" -#: /controllers/surveygroups_controller.php:75 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:78 msgid "View/Edit Group Set" msgstr "" -#: /controllers/surveygroups_controller.php:76 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:79 msgid "Delete Group Set" msgstr "" -#: /controllers/surveygroups_controller.php:157 -msgid "Error: Invalid course ID or event ID." -msgstr "" - -#: /controllers/surveygroups_controller.php:175 -msgid "View Survey Result" +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:149 +msgid "DOMDocument could not be found. Please contact your\n system administrator to use TeamMaker." msgstr "" -#: /controllers/surveygroups_controller.php:199 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:154 msgid "Create Group Set" msgstr "" -#: /controllers/surveygroups_controller.php:239 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:200 msgid "Survey Groups > Teams Summary" msgstr "" -#: /controllers/surveygroups_controller.php:349 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:295 msgid "The group set was added successfully." msgstr "" -#: /controllers/surveygroups_controller.php:351 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:297 msgid "The group set saving failed." msgstr "" -#: /controllers/surveygroups_controller.php:369 -msgid "Group Set must be a numeric id" -msgstr "" - -#: /controllers/surveygroups_controller.php:374 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:328 msgid "The group set was released successfully." msgstr "" -#: /controllers/surveygroups_controller.php:376 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:330 msgid "Releasing group set failed." msgstr "" -#: /controllers/surveygroups_controller.php:404 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:362 msgid "The group set was deleted successfully." msgstr "" -#: /controllers/surveygroups_controller.php:406 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:364 msgid "Failed to delete group set." msgstr "" -#: /controllers/surveygroups_controller.php:423 -msgid " > Edit Groupset" -msgstr "" - -#: /controllers/surveygroups_controller.php:512 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:480 msgid "Group set change failed." msgstr "" -#: /controllers/surveygroups_controller.php:546 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:485 msgid "Group set changed successfully." msgstr "" -#: /controllers/surveys_controller.php:28;145 +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:525 +msgid "Export Survey Groups" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:534 +msgid "Please select a survey group set to export." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/surveygroups_controller.php:538 +msgid "Please select at least one export field." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:31;173 msgid "Surveys" msgstr "" -#: /controllers/surveys_controller.php:76 -#: /controllers/sysparameters_controller.php:58 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:74 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:58 msgid "ID" msgstr "" -#: /controllers/surveys_controller.php:81 -#: /views/courses/view.ctp:33 -msgid "Created By" +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:79 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:81 +msgid "Questions" msgstr "" -#: /controllers/surveys_controller.php:90 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:90 msgid "Surveys to show:" msgstr "" -#: /controllers/surveys_controller.php:106 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:134 msgid "Are you sure you want to delete this survey permanently?" msgstr "" -#: /controllers/surveys_controller.php:108 -#: /views/surveys/view.ctp:2 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:136 msgid "View Survey" msgstr "" -#: /controllers/surveys_controller.php:109 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:137 msgid "Edit Survey" msgstr "" -#: /controllers/surveys_controller.php:110;412 -msgid "View Questions" +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:138;437 +msgid "Edit Questions" msgstr "" -#: /controllers/surveys_controller.php:111 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:139 msgid "Copy Survey" msgstr "" -#: /controllers/surveys_controller.php:112 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:140 msgid "Delete Survey" msgstr "" -#: /controllers/surveys_controller.php:214 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:241 msgid "Survey is saved!" msgstr "" -#: /controllers/surveys_controller.php:218 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:245 msgid "Error on saving survey." msgstr "" -#: /controllers/surveys_controller.php:271 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:283;410;507;560 +msgid "Error: You do not have permission to edit this survey" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:298;425 +msgid "Submissions have been made. %s cannot be edited. Please make a copy." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:307 msgid "The Survey was edited successfully." msgstr "" -#: /controllers/surveys_controller.php:314 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:311 +msgid "Error: The Survey was not saved successfully." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:349 msgid "Copy" msgstr "" -#: /controllers/surveys_controller.php:359 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:367 +msgid "Error: You do not have permission to delete this survey" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:387 msgid "The survey was deleted successfully." msgstr "" -#: /controllers/surveys_controller.php:361 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:389 msgid "Survey delete failed." msgstr "" -#: /controllers/surveys_controller.php:464 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:488 msgid "The question was removed successfully." msgstr "" -#: /controllers/surveys_controller.php:489 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:531 msgid "The question was added successfully." msgstr "" -#: /controllers/surveys_controller.php:523 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:538 +msgid "Failed to save question." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:592 msgid "The question was updated successfully." msgstr "" -#: /controllers/surveys_controller.php:526 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:595 msgid "Error in saving question." msgstr "" -#: /controllers/surveys_controller.php:535 +#: /Users/compass/projects/ipeer/src/controllers/surveys_controller.php:602 msgid "Edit Question" msgstr "" -#: /controllers/sysparameters_controller.php:45 -#: /views/sys_parameters/add.ctp:7 -#: /views/sys_parameters/edit.ctp:8 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:45 msgid "Sys Parameters" msgstr "" -#: /controllers/sysparameters_controller.php:59 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:59 msgid "Code" msgstr "" -#: /controllers/sysparameters_controller.php:60 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:60 msgid "Value" msgstr "" -#: /controllers/sysparameters_controller.php:65 -#: /views/surveys/view.ctp:12 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:65 +#: /Users/compass/projects/ipeer/src/views/emailer/view.ctp:45 +#: /Users/compass/projects/ipeer/src/views/surveys/view.ctp:12 msgid "Created" msgstr "" -#: /controllers/sysparameters_controller.php:66 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:66 msgid "Updated" msgstr "" -#: /controllers/sysparameters_controller.php:68 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:68 msgid "Are you sure you wish to delete this System Parameter?" msgstr "" -#: /controllers/sysparameters_controller.php:73 -#: /views/departments/index.ctp:49 -#: /views/elements/emailer/edit_recipient.ctp:3 -#: /views/elements/events/ajax_event_list.ctp:31 -#: /views/elements/survey_groups/ajax_survey_group_list.ctp:24 -#: /views/faculties/index.ctp:49 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:73 +#: /Users/compass/projects/ipeer/src/views/departments/index.ctp:49 +#: /Users/compass/projects/ipeer/src/views/elements/emailer/edit_recipient.ctp:3 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:31 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_group_list.ctp:24 +#: /Users/compass/projects/ipeer/src/views/faculties/index.ctp:49 +#: /Users/compass/projects/ipeer/src/views/surveys/questionssummary.ctp:33 msgid "Delete" msgstr "" -#: /controllers/sysparameters_controller.php:137 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:123;146;171 +msgid "String" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:123;146;171 +msgid "Integer" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:123;146;171 +msgid "Boolean" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:139 msgid "The record is saved successfully" msgstr "" -#: /controllers/sysparameters_controller.php:140 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:142 msgid "Failed to save the record" msgstr "" -#: /controllers/sysparameters_controller.php:160 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:164 msgid "The record is edited successfully." msgstr "" -#: /controllers/sysparameters_controller.php:180 +#: /Users/compass/projects/ipeer/src/controllers/sysparameters_controller.php:187 msgid "The record is deleted successfully." msgstr "" -#: /controllers/upgrade_controller.php:27 +#: /Users/compass/projects/ipeer/src/controllers/upgrade_controller.php:27 msgid "Upgrade" msgstr "" -#: /controllers/upgrade_controller.php:30 +#: /Users/compass/projects/ipeer/src/controllers/upgrade_controller.php:30 msgid "It seems you do not have a installation of iPeer. Please install it first!" msgstr "" -#: /controllers/users_controller.php:33 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:37 msgid "Users" msgstr "" -#: /controllers/users_controller.php:81 -#: /views/elements/email/html/resetPassword.ctp:2 -#: /views/elements/email/text/addUser.ctp:3 -#: /views/elements/email/text/resetPassword.ctp:3 -#: /views/elements/framework/view_user_detail.ctp:3 -#: /views/elements/users/ajax_user_list.ctp:25 -#: /views/elements/users/user_summary_list.ctp:5 -#: /views/users/edit_profile.ctp:9 -msgid "Username" -msgstr "" - -#: /controllers/users_controller.php:88 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:98;1117 msgid "Full Name" msgstr "" -#: /controllers/users_controller.php:107 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:117 msgid "Delete this user. Irreversible. Are you sure?" msgstr "" -#: /controllers/users_controller.php:108 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:118 msgid "Resets user Password. Are you sure?" msgstr "" -#: /controllers/users_controller.php:116 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:127 msgid "Show role:" msgstr "" -#: /controllers/users_controller.php:127 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:162;384 +msgid "View User" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:163 msgid "Send Email" msgstr "" -#: /controllers/users_controller.php:128 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:164 msgid "Edit User" msgstr "" -#: /controllers/users_controller.php:129 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:165 msgid "Delete User" msgstr "" -#: /controllers/users_controller.php:130 -#: /views/elements/email/html/resetPassword.ctp:1 -#: /views/elements/email/text/resetPassword.ctp:2 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:166 msgid "Reset Password" msgstr "" -#: /controllers/users_controller.php:220 -#: /views/courses/home.ctp:35 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:257 +#: /Users/compass/projects/ipeer/src/views/courses/home.ctp:49 msgid "Students" msgstr "" -#: /controllers/users_controller.php:242;248;255 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:279;285;292 msgid "Failed to save.
" msgstr "" -#: /controllers/users_controller.php:315 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:347 +msgid "Error: You do not have permission to view users" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:352 msgid "Error: This user does not exist" msgstr "" -#: /controllers/users_controller.php:566 -#: /views/users/index.ctp:5 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:358;379 +msgid "Error: You do not have permission to view this user" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:589 +#: /Users/compass/projects/ipeer/src/views/users/index.ctp:8 msgid "Add User" msgstr "" -#: /controllers/users_controller.php:585 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:609 +msgid "Error: You do not have permission to enrol this user." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:613 +msgid "Error: The student is already enrolled." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:627 +msgid "User is successfully enrolled." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:629 +msgid "Error: Unable to enrol the user." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:652 msgid "Error: You do not have permission to edit users." msgstr "" -#: /controllers/users_controller.php:602 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:710 msgid "User successfully updated!" msgstr "" -#: /controllers/users_controller.php:611 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:719 msgid "Error: Unable to update user." msgstr "" -#: /controllers/users_controller.php:620 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:728 msgid "Error: This user does not exist." msgstr "" -#: /controllers/users_controller.php:625 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:733 msgid "Error: You do not have permission to edit this user." msgstr "" -#: /controllers/users_controller.php:656 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:764 msgid "Error: You do not have permission to edit this user" msgstr "" -#: /controllers/users_controller.php:686 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:795 msgid "New passwords do not match" msgstr "" -#: /controllers/users_controller.php:690 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:799 msgid "Old password is incorrect" msgstr "" -#: /controllers/users_controller.php:699 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:808 msgid "Your Profile Has Been Updated Successfully." msgstr "" -#: /controllers/users_controller.php:700 -msgid "Go to your iPeer Home page." -msgstr "" - -#: /controllers/users_controller.php:719 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:827 msgid "Edit Profile" msgstr "" -#: /controllers/users_controller.php:770 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:878 msgid "Error: You do not have permission to delete this user" msgstr "" -#: /controllers/users_controller.php:785 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:894 msgid "Record is successfully deleted!" msgstr "" -#: /controllers/users_controller.php:787 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:896 msgid "Error: Delete failed!" msgstr "" -#: /controllers/users_controller.php:809 -#: /views/elements/users/ajax_username_validate.ctp:5 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:900 +msgid "Student is successfully unenrolled!" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:902 +msgid "Error: Unenrol failed!" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:925 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_username_validate.ctp:5 msgid "Username \"" msgstr "" -#: /controllers/users_controller.php:809 -#: /views/elements/users/ajax_username_validate.ctp:5 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:925 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_username_validate.ctp:5 msgid "\" already exists." msgstr "" -#: /controllers/users_controller.php:844 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:968 msgid "User Not Found!" msgstr "" -#: /controllers/users_controller.php:865 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:989 msgid "Error: You do not have permission to reset the password for this user" msgstr "" -#: /controllers/users_controller.php:882 -msgid "Password successfully reset. The new password is %s.\n" +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1006 +msgid "Password successfully reset. The new password is %s." msgstr "" -#: /controllers/users_controller.php:889 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1013 msgid "Email has been sent. " msgstr "" -#: /controllers/users_controller.php:892 -msgid "No destination email address. " +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1015 +msgid "Email was not sent to the user. " msgstr "" -#: /controllers/users_controller.php:894 -msgid "Email was not sent to the user. " +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1018 +msgid "No email has been sent. User does not have email address." msgstr "" -#: /controllers/users_controller.php:916 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1040 msgid "Error: That course does not exist." msgstr "" -#: /controllers/users_controller.php:931 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1055 msgid "Import Students From Text (.txt) or CSV File (.csv)" msgstr "" -#: /controllers/components/export.php:343 +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1119 +#: /Users/compass/projects/ipeer/src/views/elements/framework/view_user_detail.ctp:27 +msgid "Student No." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1121 +#: /Users/compass/projects/ipeer/src/views/users/index.ctp:5 +msgid "Merge Users" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1133 +msgid "Error: The secondary account is the currently logged in user." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1138 +msgid "Error: The users do not have the same role." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1143 +msgid "Error: No merger needed. The primary and secondary accounts are the same." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1163 +msgid "The two accounts have successfully merged." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/users_controller.php:1166 +msgid "Error: The two accounts could not be merged." +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export.php:343 msgid "Status(X/OK)," msgstr "" -#: /controllers/components/export.php:344 +#: /Users/compass/projects/ipeer/src/controllers/components/export.php:344 msgid "Group Name," msgstr "" -#: /controllers/components/export.php:345 +#: /Users/compass/projects/ipeer/src/controllers/components/export.php:345 msgid "First Name," msgstr "" -#: /controllers/components/export.php:346 +#: /Users/compass/projects/ipeer/src/controllers/components/export.php:346 msgid "Last Name," msgstr "" -#: /controllers/components/export.php:347 +#: /Users/compass/projects/ipeer/src/controllers/components/export.php:347 msgid "Student Number," msgstr "" -#: /controllers/components/export.php:348 +#: /Users/compass/projects/ipeer/src/controllers/components/export.php:348 msgid "Email," msgstr "" -#: /controllers/components/export.php:349 +#: /Users/compass/projects/ipeer/src/controllers/components/export.php:349 msgid "Final Mark," msgstr "" -#: /controllers/components/export.php:357 -#: /views/elements/rubrics/ajax_rubric_view.ctp:20 -#: /views/evaluations/student_view_simple_evaluation_results.ctp:63 +#: /Users/compass/projects/ipeer/src/controllers/components/export.php:357 +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:97 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_view.ctp:27;96 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:68 msgid "Comments" msgstr "" -#: /controllers/components/framework.php:29 +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:62 +msgid "Members who have not submitted their evaluations" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:67 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results.ctp:32 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:44 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results.ctp:22 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:31 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:53 +msgid "Left the group, but had submitted or were evaluated" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:73 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/search_menu.ctp:6 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results.ctp:66 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:68 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results.ctp:34 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:67 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:68 +msgid "Evaluation Results" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:195;546 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:93 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:290 +#: /Users/compass/projects/ipeer/src/views/helpers/evaluation.php:48;153 +msgid "Evaluatee" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:208;551 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:104 +msgid "Final Total" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:253;714 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_event_info.ctp:9 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/view_event_info.ctp:6 +#: /Users/compass/projects/ipeer/src/views/evaluations/mixeval_eval_form.ctp:64 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:8 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results.ctp:51 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:74 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:8 +#: /Users/compass/projects/ipeer/src/views/mixevals/add.ctp:32 +msgid "Self-Evaluation" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:360;457 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_event_info.ctp:48 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:32 +#: /Users/compass/projects/ipeer/src/views/helpers/evaluation.php:124;205 +msgid "Group Average" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:530 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:133 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:79 +#: /Users/compass/projects/ipeer/src/views/helpers/evaluation.php:225 +msgid "Evaluator" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:548 +msgid "Number of Evaluators" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:568 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_rubric_details.ctp:56 +msgid "General Comment" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:711 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:14 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/view_event_info.ctp:4 +#: /Users/compass/projects/ipeer/src/views/elements/groups/ajax_group_validate.ctp:6 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:6 +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:36;54 +msgid "Group" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:717 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:139 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_event_info.ctp:19 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/view_event_info.ctp:10 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:5 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:5 +msgid "Event Name" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/export_pdf.php:720 +msgid "Evaluation Type" +msgstr "" + +#: /Users/compass/projects/ipeer/src/controllers/components/framework.php:29 msgid "No filename extension. Must be csv." msgstr "" -#: /controllers/components/framework.php:36 +#: /Users/compass/projects/ipeer/src/controllers/components/framework.php:36 msgid "Error reading file" msgstr "" -#: /controllers/components/framework.php:39 +#: /Users/compass/projects/ipeer/src/controllers/components/framework.php:39 msgid "iPeer does not support the file type '." msgstr "" -#: /controllers/components/framework.php:40 +#: /Users/compass/projects/ipeer/src/controllers/components/framework.php:40 msgid "'. Please use only text files (.txt) or comma seperated values files (.csv)." msgstr "" -#: /controllers/components/framework.php:64 +#: /Users/compass/projects/ipeer/src/controllers/components/framework.php:64 msgid "days" msgstr "" -#: /controllers/components/framework.php:66 +#: /Users/compass/projects/ipeer/src/controllers/components/framework.php:66 msgid "hours" msgstr "" -#: /controllers/components/framework.php:68 +#: /Users/compass/projects/ipeer/src/controllers/components/framework.php:68 msgid "minutes" msgstr "" -#: /controllers/components/framework.php:70 +#: /Users/compass/projects/ipeer/src/controllers/components/framework.php:70 msgid "seconds" msgstr "" -#: /libs/upgrade_scripts/upgrade_300.php:62 -msgid "Database patching failed: " +#: /Users/compass/projects/ipeer/src/controllers/components/penalty.php:39;50 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:222 +#: /Users/compass/projects/ipeer/src/views/helpers/evaluation.php:101;107;134;137 +msgid "N/A" msgstr "" -#: /libs/upgrade_scripts/upgrade_base.php:39 -msgid "You need to implemented up() function in the upgrade script." +#: /Users/compass/projects/ipeer/src/libs/upgrade_scripts/upgrade_300.php:77 +#: /Users/compass/projects/ipeer/src/libs/upgrade_scripts/upgrade_310.php:81 +msgid "Database patching failed: %s" msgstr "" -#: /libs/upgrade_scripts/upgrade_base.php:50 -msgid "You need to implemented down() function in the upgrade script." +#: /Users/compass/projects/ipeer/src/libs/upgrade_scripts/upgrade_base.php:39 +msgid "You need to implemented up() function in the upgrade script." msgstr "" -#: /models/mixeval.php:182 -#: /models/rubric.php:226 -msgid "Copy of " +#: /Users/compass/projects/ipeer/src/libs/upgrade_scripts/upgrade_base.php:50 +msgid "You need to implemented down() function in the upgrade script." msgstr "" -#: /models/user.php:559 +#: /Users/compass/projects/ipeer/src/models/user.php:625 msgid "Invalid column number on line %d" msgstr "" -#: /models/user.php:564 +#: /Users/compass/projects/ipeer/src/models/user.php:630 msgid "Username can not be empty. line %d" msgstr "" -#: /models/user.php:596 +#: /Users/compass/projects/ipeer/src/models/user.php:662 msgid "No valid user to add" msgstr "" -#: /plugins/extended_test_case/libs/extended_test_case.php:203 +#: /Users/compass/projects/ipeer/src/plugins/extended_test_case/libs/extended_test_case.php:203 msgid "Skipped entire test method: %s" msgstr "" -#: /plugins/file_upload/controllers/components/file_upload.php:184 -msgid "Please select a file to upload." -msgstr "" - -#: /plugins/file_upload/vendors/uploader.php:91 +#: /Users/compass/projects/ipeer/src/plugins/file_upload/vendors/uploader.php:91 msgid "No filename resulting after parsing. Function: %s" msgstr "" -#: /plugins/file_upload/vendors/uploader.php:149 +#: /Users/compass/projects/ipeer/src/plugins/file_upload/vendors/uploader.php:149 msgid "Unable to save temp file to file system." msgstr "" -#: /plugins/file_upload/vendors/uploader.php:208 +#: /Users/compass/projects/ipeer/src/plugins/file_upload/vendors/uploader.php:208 msgid "%s is not an allowed type." msgstr "" -#: /plugins/file_upload/vendors/uploader.php:217 +#: /Users/compass/projects/ipeer/src/plugins/file_upload/vendors/uploader.php:217 msgid "extension is not allowed." msgstr "" -#: /plugins/file_upload/vendors/uploader.php:258 +#: /Users/compass/projects/ipeer/src/plugins/file_upload/vendors/uploader.php:258 msgid "File exceeds %s byte limit." msgstr "" -#: /plugins/guard/controllers/components/guard.php:251 +#: /Users/compass/projects/ipeer/src/plugins/guard/controllers/components/guard.php:258 msgid "Could not find AclComponent. Please include Acl in Controller::$components." msgstr "" -#: /vendors/shells/create_acl.php:195 +#: /Users/compass/projects/ipeer/src/vendors/shells/create_acl.php:197 msgid "Created Aco node for controllers" msgstr "" -#: /vendors/shells/create_acl.php:223;234;239;259 +#: /Users/compass/projects/ipeer/src/vendors/shells/create_acl.php:225;236;241;261 msgid "Created Aco node for " msgstr "" -#: /vendors/shells/create_acl.php:223 +#: /Users/compass/projects/ipeer/src/vendors/shells/create_acl.php:225 msgid " Plugin" msgstr "" -#: /vendors/shells/create_acl.php:234 +#: /Users/compass/projects/ipeer/src/vendors/shells/create_acl.php:236 msgid " Plugin Controller" msgstr "" -#: /vendors/shells/create_acl.php:419 +#: /Users/compass/projects/ipeer/src/vendors/shells/create_acl.php:421 msgid "Error importing " msgstr "" -#: /vendors/shells/create_acl.php:419 +#: /Users/compass/projects/ipeer/src/vendors/shells/create_acl.php:421 msgid " for plugin " msgstr "" -#: /vendors/shells/schema_ci.php:126 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:126 msgid "Schema file (%s) could not be found." msgstr "" -#: /vendors/shells/schema_ci.php:138 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:138 msgid "Generating Schema..." msgstr "" -#: /vendors/shells/schema_ci.php:197;200 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:197;200 msgid "Schema file: %s generated" msgstr "" -#: /vendors/shells/schema_ci.php:218 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:218 msgid "Schema could not be loaded" msgstr "" -#: /vendors/shells/schema_ci.php:243 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:243 msgid "SQL dump file created in %s" msgstr "" -#: /vendors/shells/schema_ci.php:246 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:246 msgid "SQL dump could not be created" msgstr "" -#: /vendors/shells/schema_ci.php:290 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:290 msgid "Performing a dry run." msgstr "" -#: /vendors/shells/schema_ci.php:302 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:302 msgid "%s could not be loaded" msgstr "" -#: /vendors/shells/schema_ci.php:333;383 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:333;383 msgid "Schema is up to date." msgstr "" -#: /vendors/shells/schema_ci.php:341 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:341 msgid "Dropping table(s)." msgstr "" -#: /vendors/shells/schema_ci.php:349 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:349 msgid "Creating table(s)." msgstr "" -#: /vendors/shells/schema_ci.php:352 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:352 msgid "End create." msgstr "" -#: /vendors/shells/schema_ci.php:364 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:364 msgid "Comparing Database to Schema..." msgstr "" -#: /vendors/shells/schema_ci.php:387 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:387 msgid "The following statements will run." msgstr "" -#: /vendors/shells/schema_ci.php:389 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:389 msgid "Are you sure you want to alter the tables?" msgstr "" -#: /vendors/shells/schema_ci.php:391 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:391 msgid "Updating Database..." msgstr "" -#: /vendors/shells/schema_ci.php:395 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:395 msgid "End update." msgstr "" -#: /vendors/shells/schema_ci.php:405 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:405 msgid "Sql could not be run" msgstr "" -#: /vendors/shells/schema_ci.php:413 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:413 msgid "%s is up to date." msgstr "" -#: /vendors/shells/schema_ci.php:416 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:416 msgid "Dry run for %s :" msgstr "" -#: /vendors/shells/schema_ci.php:432 +#: /Users/compass/projects/ipeer/src/vendors/shells/schema_ci.php:432 msgid "%s updated." msgstr "" -#: /vendors/shells/testreport.php:43 +#: /Users/compass/projects/ipeer/src/vendors/shells/testreport.php:43 msgid "You must install Xdebug to use the CakePHP(tm) Code Coverage Analyzation. Download it from http://www.xdebug.org/docs/install" msgstr "" -#: /views/courses/home.ctp:46 -#: /views/elements/searchs/search_menu.ctp:5 +#: /Users/compass/projects/ipeer/src/views/accesses/view.ctp:6 +#: /Users/compass/projects/ipeer/src/views/elements/framework/view_user_detail.ctp:5 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:26 +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:20 +msgid "Role" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/edit.ctp:6 +msgid "Course subjects and course numbers, e.g. APSC 201 001" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/edit.ctp:8 +msgid "Course title, e.g. Technical Communication" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/edit.ctp:25 +msgid "Add Instructor" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/edit.ctp:54 +msgid "Add Tutor" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/edit.ctp:77 +msgid "Selecting correct assoication will allow admin to help troubleshooting." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/edit.ctp:79 +msgid "e.g. http://mycoursehome.com" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/edit.ctp:81 +#: /Users/compass/projects/ipeer/src/views/departments/edit.ctp:6 +#: /Users/compass/projects/ipeer/src/views/faculties/edit.ctp:9 +#: /Users/compass/projects/ipeer/src/views/mixevals/add.ctp:49 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:89 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/edit.ctp:51 +#: /Users/compass/projects/ipeer/src/views/sys_parameters/add.ctp:8 +#: /Users/compass/projects/ipeer/src/views/sys_parameters/edit.ctp:9 +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:61 +msgid "Save" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/home.ctp:60 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/search_menu.ctp:5 msgid "Evaluation Events" msgstr "" -#: /views/courses/home.ctp:52 -#: /views/evaltools/index.ctp:146 -msgid "Surveys (Team Maker)" +#: /Users/compass/projects/ipeer/src/views/courses/home.ctp:66 +msgid "Team Maker" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:2 +#: /Users/compass/projects/ipeer/src/views/courses/move.ctp:2 +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:2 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:270 +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:2 +#: /Users/compass/projects/ipeer/src/views/survey_groups/export.ctp:2 +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:2 +#: /Users/compass/projects/ipeer/src/views/users/merge.ctp:2 +msgid "Instructions" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:4 +#: /Users/compass/projects/ipeer/src/views/courses/move.ctp:4 +msgid "All fields are mandatory." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:5 +msgid "When all fields are filled, the Submit button will become available." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:6 +msgid "If the source course does not have a survey, the source survey and destination survey fields are not required." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:7 +msgid "You can choose to import into a duplicate of the source survey or choose an existing survey." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:8 +#: /Users/compass/projects/ipeer/src/views/courses/move.ctp:6 +msgid "The conditions below must be met for the move to be successful." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:10 +#: /Users/compass/projects/ipeer/src/views/courses/move.ctp:8 +msgid "Conditions" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:12 +msgid "Only Text (.txt) and CSV File (.csv) can be used." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:13 +msgid "Only student numbers and usernames can be used in the file but not both." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:14 +#: /Users/compass/projects/ipeer/src/views/courses/move.ctp:12 +msgid "The Destination Course must be accessible to you." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:15 +msgid "The existing Destination Survey needs to use the same template as the Source Survey." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:17 +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:16 +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:17 +msgid "Examples:" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:30 +msgid "Move or Copy Group of Students" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:37 +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:32 +msgid "Student Identifier" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:43;53 +msgid "No surveys were found in the Source Course." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:49 +msgid "Destination Survey" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:57 +msgid "Move or Copy?" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import.ctp:60 +#: /Users/compass/projects/ipeer/src/views/courses/move.ctp:29 +msgid "\"Move\" will unenrol the student from the Source Course." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import_summary.ctp:2 +msgid "User(s) failed to transfer:" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import_summary.ctp:3 +msgid "Reason" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import_summary.ctp:6 +msgid "User(s) successfully transferred:" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/import_summary.ctp:7 +msgid "Note" msgstr "" -#: /views/courses/index.ctp:7 +#: /Users/compass/projects/ipeer/src/views/courses/import_summary.ctp:11 +#: /Users/compass/projects/ipeer/src/views/users/user_summary.ctp:22 +msgid "Back to Course" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/index.ctp:7 msgid "Add Course" msgstr "" -#: /views/courses/view.ctp:8 +#: /Users/compass/projects/ipeer/src/views/courses/move.ctp:5 +msgid "When all fields have been filled, the Submit button will become available." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/move.ctp:10 +msgid "The Source Course must have a survey." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/move.ctp:11 +msgid "The Student being moved must have made a submission to the Source Survey." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/move.ctp:13 +msgid "The Source Survey needs to use the same template as the Source Survey." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/move.ctp:15 +msgid "Move or Copy Student" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:8 msgid "Instructor(s)" msgstr "" -#: /views/courses/view.ctp:16 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:16 msgid " Email To All" msgstr "" -#: /views/courses/view.ctp:16 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:16 msgid " Email To All Instructors" msgstr "" -#: /views/courses/view.ctp:27 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:27 msgid "Homepage" msgstr "" -#: /views/courses/view.ctp:35 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:33 +msgid "Created By" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:35 msgid "Updated By" msgstr "" -#: /views/courses/view.ctp:39 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:39 msgid "Created At" msgstr "" -#: /views/courses/view.ctp:41 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:41 msgid "Updated At" msgstr "" -#: /views/courses/view.ctp:46 -#: /views/elements/mixevals/view_mixeval_details.ctp:174 -#: /views/mixevals/edit.ctp:58 -#: /views/rubrics/edit.ctp:50 -#: /views/simple_evaluations/edit.ctp:62 -#: /views/simple_evaluations/view.ctp:28 -#: /views/surveys/add_question.ctp:55 -#: /views/surveys/edit.ctp:21 -#: /views/surveys/view.ctp:21 -#: /views/sys_parameters/add.ctp:53 -#: /views/sys_parameters/edit.ctp:60 +#: /Users/compass/projects/ipeer/src/views/courses/view.ctp:46 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:80 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/edit.ctp:50 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/view.ctp:28 +#: /Users/compass/projects/ipeer/src/views/surveys/edit.ctp:27 +#: /Users/compass/projects/ipeer/src/views/surveys/view.ctp:54 msgid "Back" msgstr "" -#: /views/departments/add.ctp:5 -#: /views/sys_parameters/edit.ctp:8 +#: /Users/compass/projects/ipeer/src/views/departments/add.ctp:5 +#: /Users/compass/projects/ipeer/src/views/elements/mixevals/questions_editor.ctp:217;226 msgid "Add" msgstr "" -#: /views/departments/edit.ctp:6 -#: /views/faculties/edit.ctp:9 -#: /views/mixevals/edit.ctp:61;69 -#: /views/rubrics/edit.ctp:61 -#: /views/simple_evaluations/edit.ctp:63 -#: /views/sys_parameters/add.ctp:53 -#: /views/sys_parameters/edit.ctp:60 -#: /views/users/edit_profile.ctp:94 -msgid "Save" -msgstr "" - -#: /views/departments/index.ctp:4 +#: /Users/compass/projects/ipeer/src/views/departments/index.ctp:4 msgid "Add Department" msgstr "" -#: /views/departments/index.ctp:54 -#: /views/faculties/index.ctp:54 +#: /Users/compass/projects/ipeer/src/views/departments/index.ctp:54 +#: /Users/compass/projects/ipeer/src/views/faculties/index.ctp:54 msgid "Are you sure you want to delete %s?" msgstr "" -#: /views/elements/creator_block.ctp:11 -#: /views/elements/framework/view_user_detail.ctp:60 +#: /Users/compass/projects/ipeer/src/views/elements/creator_block.ctp:11 +#: /Users/compass/projects/ipeer/src/views/elements/framework/view_user_detail.ctp:64 +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:26 +#: /Users/compass/projects/ipeer/src/views/sys_parameters/view.ctp:8 msgid "Create Date" msgstr "" -#: /views/elements/creator_block.ctp:16 -#: /views/elements/framework/view_user_detail.ctp:56 +#: /Users/compass/projects/ipeer/src/views/elements/creator_block.ctp:16 +#: /Users/compass/projects/ipeer/src/views/elements/framework/view_user_detail.ctp:60 +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:27 msgid "Updater" msgstr "" -#: /views/elements/creator_block.ctp:25 -#: /views/elements/framework/view_user_detail.ctp:62 +#: /Users/compass/projects/ipeer/src/views/elements/creator_block.ctp:25 +#: /Users/compass/projects/ipeer/src/views/elements/framework/view_user_detail.ctp:66 +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:28 +#: /Users/compass/projects/ipeer/src/views/sys_parameters/view.ctp:9 msgid "Update Date" msgstr "" -#: /views/elements/courses/ajax_personalize_Course.SubMenu.EvalResults.Show.ctp:6 +#: /Users/compass/projects/ipeer/src/views/elements/courses/ajax_personalize_Course.SubMenu.EvalResults.Show.ctp:6 msgid "List Evaluation Results" msgstr "" -#: /views/elements/courses/ajax_personalize_Course.SubMenu.Rubric.Show.ctp:11 +#: /Users/compass/projects/ipeer/src/views/elements/courses/ajax_personalize_Course.SubMenu.Rubric.Show.ctp:11 msgid "List Rubrics" msgstr "" -#: /views/elements/courses/ajax_personalize_Course.SubMenu.SimpleEvals.Show.ctp:6 -#: /views/evaltools/index.ctp:117 -#: /views/simple_evaluations/index.ctp:6 +#: /Users/compass/projects/ipeer/src/views/elements/courses/ajax_personalize_Course.SubMenu.SimpleEvals.Show.ctp:6 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:126 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/index.ctp:6 msgid "Add Simple Evaluation" msgstr "" -#: /views/elements/courses/ajax_personalize_Course.SubMenu.SimpleEvals.Show.ctp:11 +#: /Users/compass/projects/ipeer/src/views/elements/courses/ajax_personalize_Course.SubMenu.SimpleEvals.Show.ctp:11 msgid "List Simple Evaulations" msgstr "" -#: /views/elements/courses/course_selection_box.ctp:13 +#: /Users/compass/projects/ipeer/src/views/elements/courses/course_selection_box.ctp:13 msgid " --- No Course Selected --- " msgstr "" -#: /views/elements/courses/course_selection_box.ctp:14 +#: /Users/compass/projects/ipeer/src/views/elements/courses/course_selection_box.ctp:14 msgid " --- All Courses --- " msgstr "" -#: /views/elements/courses/edit_instructor.ctp:7 +#: /Users/compass/projects/ipeer/src/views/elements/courses/edit_instructor.ctp:7 msgid "Are you sure to remove instructor " msgstr "" -#: /views/elements/courses/edit_instructor.ctp:7 +#: /Users/compass/projects/ipeer/src/views/elements/courses/edit_instructor.ctp:7 msgid " from this course?" msgstr "" -#: /views/elements/courses/edit_instructor.ctp:10 +#: /Users/compass/projects/ipeer/src/views/elements/courses/edit_instructor.ctp:10 msgid "Communication error!" msgstr "" -#: /views/elements/email/html/addEvent.ctp:1 -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:13 -#: /views/elements/searchs/evaluation_result_search_panel.ctp:21 -msgid "Event" -msgstr "" - -#: /views/elements/email/html/addEvent.ctp:1 -#: /views/elements/email/text/addUser.ctp:2 +#: /Users/compass/projects/ipeer/src/views/elements/email/html/addEvent.ctp:1 msgid "is created" msgstr "" -#: /views/elements/email/html/addEvent.ctp:3 -#: /views/elements/email/text/addEvent.ctp:3 +#: /Users/compass/projects/ipeer/src/views/elements/email/html/addEvent.ctp:3 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/addEvent.ctp:3 msgid "Due" msgstr "" -#: /views/elements/email/html/resetPassword.ctp:3 -#: /views/elements/email/text/addUser.ctp:4 -#: /views/elements/email/text/resetPassword.ctp:4 -#: /views/elements/users/user_summary_list.ctp:9 +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:2 +#: /Users/compass/projects/ipeer/src/views/elements/email/html/resetPassword.ctp:1 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/addUser.ctp:2 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:2 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/resetPassword.ctp:2 +msgid "Hello " +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:5 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:3 +msgid "A " +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:5 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:3 +msgid " for " +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:5 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:3 +msgid " is made available to " +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:6 +msgid "you in iPeer, which has yet to be completed." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:11 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:7 +msgid "Close Date" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:14 +msgid "You can login " +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:14 +msgid "here" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:14 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:8 +msgid " to complete the " +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:15 +msgid " before it closes." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:17 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:10 +msgid " There is a penalty for submitting after the due date." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/eventReminder.ctp:21 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:12 +msgid "Thank you" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/resetPassword.ctp:2 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/resetPassword.ctp:3 +msgid "Your iPeer password has been reset to the password below." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/html/resetPassword.ctp:4 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/addUser.ctp:5 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/resetPassword.ctp:5 +#: /Users/compass/projects/ipeer/src/views/elements/users/user_summary_list.ctp:9 msgid "Password" msgstr "" -#: /views/elements/email/text/addEvent.ctp:1 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/addEvent.ctp:1 msgid "Event " msgstr "" -#: /views/elements/email/text/addEvent.ctp:1 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/addEvent.ctp:1 msgid " is created" msgstr "" -#: /views/elements/emailer/edit_recipient.ctp:7 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/addUser.ctp:3 +msgid "An instructor or admin has created an account for you in iPeer." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/text/addUser.ctp:6 +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:8 +msgid "You can login at " +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/email/text/eventReminder.ctp:4 +msgid "you in iPeer, which has yet to be completed.\n\n" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/emailer/edit_recipient.ctp:7 msgid " will be removed from the To: field..." msgstr "" -#: /views/elements/emailer/edit_recipient.ctp:15 +#: /Users/compass/projects/ipeer/src/views/elements/emailer/edit_recipient.ctp:15 msgid "Removal error!" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_list.ctp:8 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_list.ctp:8 msgid "Page Size" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_list.ctp:26 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_list.ctp:26 msgid "Evaluation Event Title" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_list.ctp:30 -#: /views/elements/events/ajax_event_list.ctp:19 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_list.ctp:30 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:19 msgid "Self Evaluation" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_list.ctp:45 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_list.ctp:45 msgid "View " msgstr "" -#: /views/elements/evaluations/ajax_evaluation_list.ctp:85 -#: /views/elements/users/ajax_user_list.ctp:93 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_list.ctp:85 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:93 msgid "Page %page% of %pages%, showing %current% records out of %count% total
" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:14 -#: /views/elements/evaluations/view_event_info.ctp:4 -#: /views/elements/groups/ajax_group_validate.ctp:6 -#: /views/evaluations/view_simple_evaluation_results.ctp:6 -msgid "Group" -msgstr "" - -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:15 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:15 msgid "Completion Rate" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:18 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:18 msgid "Released Comments" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:19 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:19 msgid "Released Grades" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:28 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:28 msgid "View Evaluation Result" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:34 -#: /views/events/view.ctp:12 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:34 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:12 msgid "Event Title" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:37 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:37 msgid "Group Submission Detail" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:37 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:37 msgid "Group " msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:39 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:39 msgid "completed" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:50 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:50 msgid "Not Completed" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:61 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:61 msgid "marked" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:64 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:64 msgid "Ready to Review" msgstr "" -#: /views/elements/evaluations/ajax_evaluation_result_list.ctp:67 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/ajax_evaluation_result_list.ctp:67 msgid "Not Ready to Review" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:27 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/mixeval_details.ctp:4 +msgid " Comments/Grades Not Released Yet" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/mixeval_details.ctp:6 +msgid " Grades Not Released Yet" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/mixeval_details.ctp:8 +msgid " Comments Not Released Yet" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/mixeval_details.ctp:30;81 +msgid "Grades Not Released Yet" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/mixeval_details.ctp:33 +msgid "Comments Not Released Yet" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/mixeval_details.ctp:46 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:149 +msgid "Grade:" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:27 msgid "All points are allocated." msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:32 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:32 msgid "All points are allocated.
There are still " msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:32;47;61 -msgid "comments to be filled." +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:32;47;61 +msgid " comments to be filled." msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:36 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:36 msgid "All points are allocated.
All comments are filled." msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:44;47;50 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:44;47;50 msgid "Too many points, need to unallocate" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:44 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:44 msgid "points." msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:47 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:47 msgid "points.
There are still" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:50 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:50 msgid "points.
All comments are filled." msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:58;61;64 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:58;61;64 msgid "Please allocate" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:58 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:58 msgid "more points." msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:61 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:61 msgid " more points.
There are still" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:64 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:64 msgid " more points.
All comments are filled." msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:130 -#: /views/elements/evaluations/view_event_info.ctp:2 -#: /views/evaluations/mixeval_eval_form.ctp:18 -#: /views/evaluations/rubric_eval_form.ctp:17 -#: /views/evaluations/view_simple_evaluation_results.ctp:1 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:130 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/view_event_info.ctp:2 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:63 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:1 msgid "Evaluation Event Detail" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:133 -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:212;278 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:196 -#: /views/evaluations/view_simple_evaluation_results.ctp:54 -msgid "Evaluator" -msgstr "" - -#: /views/elements/evaluations/simple_eval_form.ctp:135 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:135 msgid "Evaluating" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:139 -#: /views/elements/evaluations/student_view_event_info.ctp:19 -#: /views/elements/evaluations/view_event_info.ctp:10 -#: /views/evaluations/student_view_simple_evaluation_results.ctp:5 -#: /views/evaluations/view_simple_evaluation_results.ctp:5 -msgid "Event Name" -msgstr "" - -#: /views/elements/evaluations/simple_eval_form.ctp:150 -#: /views/evaluations/mixeval_eval_form.ctp:37 -#: /views/evaluations/rubric_eval_form.ctp:36 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:150 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:82 msgid " Instructions" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:152 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:152 msgid "Rate your peer's relative performance by using the slider. [Weight 1-10]" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:153 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:153 msgid "Click \"Distribute\" button to distribute points." msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:154 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:154 msgid "Allocate any remaining point." msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:155 -#: /views/evaluations/mixeval_eval_form.ctp:40 -#: /views/evaluations/rubric_eval_form.ctp:39 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:155 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:85 msgid "Enter Comments" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:156 -#: /views/groups/import.ctp:8 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:155 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:85 +msgid "Required" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:155 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:85 +msgid "Optional" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:156 msgid "NOTE:" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:156 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:156 msgid "\"Submit Evaluation\" button will only be enabled when all points, and comments (if required), are filled!" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:159 -#: /views/evaluations/mixeval_eval_form.ctp:45 -#: /views/evaluations/rubric_eval_form.ctp:45 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:157 +msgid "Evaluation's release end date" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:159 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:90 +msgid "The evaluation can be repeatedly submitted until %s." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:162 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:93 msgid "Show/Hide late penalty policy" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:183 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:167 +msgid "%f day(s) late: %s deduction." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:169 +msgid "%d is deducted afterwards." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:171 +#: /Users/compass/projects/ipeer/src/views/evaluations/mixeval_eval_form.ctp:26 +msgid "No penalty is specified for this evaluation." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:185 msgid "Member(s)" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:184 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:186 msgid "Relative Weight" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:185 -#: /views/elements/rubrics/ajax_rubric_view.ctp:53 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:187 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_view.ctp:59;152 msgid "Mark" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:186 -#: /views/evaluations/mixeval_eval_form.ctp:40 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:188 msgid "(Optional)" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:234 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:236 msgid "Points Allocated/Total:" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:237 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:239 msgid "Distribute" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:244 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/simple_eval_form.ctp:246 msgid "Submit Evaluation" msgstr "" -#: /views/elements/evaluations/simple_eval_form.ctp:244 -#: /views/evaluations/mixeval_eval_form.ctp:186 -#: /views/evaluations/rubric_eval_form.ctp:152 -msgid "Once you submit the input, you cannot change them. Please review your input before submitting. Are you sure you want to submit?" -msgstr "" - -#: /views/elements/evaluations/student_view_event_info.ctp:4 -#: /views/evaluations/student_view_simple_evaluation_results.ctp:1 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_event_info.ctp:4 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:1 msgid "Evaluation Result Detail" msgstr "" -#: /views/elements/evaluations/student_view_event_info.ctp:7 -#: /views/evaluations/student_view_simple_evaluation_results.ctp:6 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_event_info.ctp:7 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:6 msgid "Evaluated By" msgstr "" -#: /views/elements/evaluations/student_view_event_info.ctp:9 -#: /views/elements/evaluations/view_event_info.ctp:6 -#: /views/evaluations/student_view_simple_evaluation_results.ctp:8 -#: /views/evaluations/view_simple_evaluation_results.ctp:8 -msgid "Self-Evaluation" -msgstr "" - -#: /views/elements/evaluations/student_view_event_info.ctp:30 -#: /views/evaluations/student_view_mixeval_evaluation_results.ctp:12 -#: /views/evaluations/student_view_rubric_evaluation_results.ctp:6 -#: /views/evaluations/student_view_simple_evaluation_results.ctp:30 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_event_info.ctp:30 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_mixeval_evaluation_results.ctp:13 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_rubric_evaluation_results.ctp:6 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:30 msgid "Rating" msgstr "" -#: /views/elements/evaluations/student_view_event_info.ctp:48 -#: /views/evaluations/student_view_simple_evaluation_results.ctp:31 -msgid "Group Average" -msgstr "" - -#: /views/elements/evaluations/student_view_mixeval_details.ctp:11 -msgid "Section One" -msgstr "" - -#: /views/elements/evaluations/student_view_mixeval_details.ctp:13;97 -#: /views/elements/evaluations/student_view_rubric_details.ctp:9 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_rubric_details.ctp:7 msgid "Person Being Evaluated" msgstr "" -#: /views/elements/evaluations/student_view_mixeval_details.ctp:24;107 -#: /views/elements/evaluations/student_view_rubric_details.ctp:18 -#: /views/evaluations/student_view_mixeval_evaluation_results.ctp:83 -#: /views/evaluations/student_view_rubric_evaluation_results.ctp:68 -msgid "Comments/Grades Not Released Yet." +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_rubric_details.ctp:15 +msgid " Comments/Grades Not Released Yet." msgstr "" -#: /views/elements/evaluations/student_view_mixeval_details.ctp:95 -#: /views/elements/mixevals/view_mixeval_details.ctp:98 -msgid "Section Two" -msgstr "" - -#: /views/elements/evaluations/student_view_rubric_details.ctp:41 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:220 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_rubric_details.ctp:26 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:137 msgid "Points" msgstr "" -#: /views/elements/evaluations/student_view_rubric_details.ctp:50;59;64;73 -#: /views/evaluations/view_simple_evaluation_results.ctp:320 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_rubric_details.ctp:35;42;47;57 msgid "n/a" msgstr "" -#: /views/elements/evaluations/student_view_rubric_details.ctp:72 -msgid "General Comment" -msgstr "" - -#: /views/elements/evaluations/student_view_survey_info.ctp:12 -#: /views/evaluations/survey_eval_form.ctp:8 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_survey_info.ctp:12 msgid "Team Maker Survey" msgstr "" -#: /views/elements/evaluations/student_view_survey_info.ctp:72 -#: /views/evaluations/survey_eval_form.ctp:36 -#: /views/oauth_clients/add.ctp:12 -#: /views/oauth_clients/edit.ctp:11 -#: /views/oauth_tokens/add.ctp:13 -#: /views/oauth_tokens/edit.ctp:12 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/student_view_survey_info.ctp:72 +#: /Users/compass/projects/ipeer/src/views/oauth_clients/add.ctp:12 +#: /Users/compass/projects/ipeer/src/views/oauth_clients/edit.ctp:11 +#: /Users/compass/projects/ipeer/src/views/oauth_tokens/add.ctp:13 +#: /Users/compass/projects/ipeer/src/views/oauth_tokens/edit.ctp:12 msgid "Submit" msgstr "" -#: /views/elements/evaluations/summary_info.ctp:2 -#: /views/evaluations/view_rubric_evaluation_results.ctp:54 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/summary_info.ctp:2 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results.ctp:15 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:27 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results.ctp:5 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:14 msgid "Basic" msgstr "" -#: /views/elements/evaluations/summary_info.ctp:3 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/summary_info.ctp:3 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results.ctp:16 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:28 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results.ctp:6 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:15 msgid "Detail" msgstr "" -#: /views/elements/evaluations/summary_info.ctp:9 -#: /views/evaluations/view_simple_evaluation_results.ctp:33 +#: /Users/compass/projects/ipeer/src/views/elements/evaluations/summary_info.ctp:9 msgid "These people have not yet submitted their evaluations" msgstr "" -#: /views/elements/events/ajax_event_list.ctp:14 -#: /views/oauth_tokens/view.ctp:37 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:14 msgid "Actions" msgstr "" -#: /views/elements/events/ajax_event_list.ctp:31 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:31 msgid "Are you sure you want to delete event" msgstr "" -#: /views/elements/events/ajax_event_list.ctp:39;42 -#: /views/elements/mixevals/view_mixeval_details.ctp:124 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:39;42 msgid "YES" msgstr "" -#: /views/elements/events/ajax_event_list.ctp:39;42 -#: /views/elements/mixevals/view_mixeval_details.ctp:126 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:39;42 msgid "NO" msgstr "" -#: /views/elements/events/ajax_event_list.ctp:45;45 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:45;45 msgid "View Groups" msgstr "" -#: /views/elements/events/ajax_event_list.ctp:54 -#: /views/elements/users/ajax_user_list.ctp:81 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:54 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:81 msgid "Record Not Found" msgstr "" -#: /views/elements/events/ajax_event_list.ctp:63 -#: /views/elements/survey_groups/ajax_survey_group_list.ctp:52 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:63 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_group_list.ctp:52 msgid "Results: " msgstr "" -#: /views/elements/events/ajax_event_list.ctp:67 -#: /views/elements/survey_groups/ajax_survey_group_list.ctp:54 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:67 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_group_list.ctp:54 msgid "Prev" msgstr "" -#: /views/elements/events/ajax_event_list.ctp:69 -#: /views/elements/survey_groups/ajax_survey_group_list.ctp:54 -#: /views/rubrics/edit.ctp:53 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_event_list.ctp:69 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_group_list.ctp:54 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:83 msgid "Next" msgstr "" -#: /views/elements/events/ajax_title_validate.ctp:5 -#: /views/elements/surveys/ajax_survey_validate.ctp:4 +#: /Users/compass/projects/ipeer/src/views/elements/events/ajax_title_validate.ctp:5 +#: /Users/compass/projects/ipeer/src/views/elements/surveys/ajax_survey_validate.ctp:4 msgid "already exists." msgstr "" -#: /views/elements/events/event_groups_detail.ctp:4 +#: /Users/compass/projects/ipeer/src/views/elements/events/event_groups_detail.ctp:4 msgid "Group No." msgstr "" -#: /views/elements/events/event_groups_detail.ctp:6 -#: /views/groups/edit.ctp:22 +#: /Users/compass/projects/ipeer/src/views/elements/events/event_groups_detail.ctp:6 +#: /Users/compass/projects/ipeer/src/views/groups/edit.ctp:20 msgid "Members" msgstr "" -#: /views/elements/events/event_selection_box.ctp:12 -#: /views/elements/searchs/ajax_event_box.ctp:12 +#: /Users/compass/projects/ipeer/src/views/elements/events/event_selection_box.ctp:12 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/ajax_event_box.ctp:12 msgid "No event Selected" msgstr "" -#: /views/elements/events/event_selection_box.ctp:14 +#: /Users/compass/projects/ipeer/src/views/elements/events/event_selection_box.ctp:14 msgid "All events" msgstr "" -#: /views/elements/framework/view_user_detail.ctp:5 -#: /views/elements/users/ajax_user_list.ctp:26 -msgid "Role" -msgstr "" - -#: /views/elements/framework/view_user_detail.ctp:27 -msgid "Student No." -msgstr "" - -#: /views/elements/global/debug.ctp:66;79;89;101;116 +#: /Users/compass/projects/ipeer/src/views/elements/global/debug.ctp:66;79;89;101;116 msgid "(Empty)" msgstr "" -#: /views/elements/global/debug.ctp:133;142 +#: /Users/compass/projects/ipeer/src/views/elements/global/debug.ctp:133;142 msgid "(No SQL Data)" msgstr "" -#: /views/elements/global/footer.ctp:3 +#: /Users/compass/projects/ipeer/src/views/elements/global/footer.ctp:3 msgid "Powered by iPeer and TeamMaker - Created by UBC and Rose-Hulman" msgstr "" -#: /views/elements/groups/ajax_group_validate.ctp:6 +#: /Users/compass/projects/ipeer/src/views/elements/groups/ajax_group_validate.ctp:6 msgid "already exists" msgstr "" -#: /views/elements/groups/group_list_chooser.ctp:22 +#: /Users/compass/projects/ipeer/src/views/elements/groups/group_list_chooser.ctp:22 msgid "Assign" msgstr "" -#: /views/elements/groups/group_list_chooser.ctp:23 -#: /views/surveys/add_question.ctp:43;72 +#: /Users/compass/projects/ipeer/src/views/elements/groups/group_list_chooser.ctp:23 msgid "Remove" msgstr "" -#: /views/elements/groups/group_list_chooser.ctp:24 +#: /Users/compass/projects/ipeer/src/views/elements/groups/group_list_chooser.ctp:24 msgid "There has been submissions in this group. Changing group members may cause data integrity issue." msgstr "" -#: /views/elements/list/ajaxList.ctp:22 +#: /Users/compass/projects/ipeer/src/views/elements/list/ajaxList.ctp:22 msgid "You need the PHP json extension." msgstr "" -#: /views/elements/list/ajaxList.ctp:23 +#: /Users/compass/projects/ipeer/src/views/elements/list/ajaxList.ctp:23 msgid " Please use PHP >= 5.2 and enable it in php.ini
" msgstr "" -#: /views/elements/list/ajaxList.ctp:24 +#: /Users/compass/projects/ipeer/src/views/elements/list/ajaxList.ctp:24 msgid " (uncomment or create the line:
" msgstr "" -#: /views/elements/list/ajaxList.ctp:28;30;32 +#: /Users/compass/projects/ipeer/src/views/elements/list/ajaxList.ctp:28;30;32 msgid " variable not set or empty!" msgstr "" -#: /views/elements/list/checkBoxList.ctp:8 +#: /Users/compass/projects/ipeer/src/views/elements/list/checkBoxList.ctp:8 msgid "Error: Please set all parameters for checkBoxList.
" msgstr "" -#: /views/elements/list/checkBoxList.ctp:56 +#: /Users/compass/projects/ipeer/src/views/elements/list/checkBoxList.ctp:56 msgid "Use the checkmarks to" msgstr "" -#: /views/elements/list/checkBoxList.ctp:57 +#: /Users/compass/projects/ipeer/src/views/elements/list/checkBoxList.ctp:57 msgid "in bold are the ones selected initially.)
" msgstr "" -#: /views/elements/list/checkBoxList.ctp:59 +#: /Users/compass/projects/ipeer/src/views/elements/list/checkBoxList.ctp:59 msgid "(The selected %s are check-marked and in bold)
" msgstr "" -#: /views/elements/mixevals/view_mixeval_details.ctp:13 -msgid "Section One: Lickert Scales" +#: /Users/compass/projects/ipeer/src/views/elements/mixevals/questions_editor.ctp:25 +msgid "Likert Answer Question" msgstr "" -#: /views/elements/mixevals/view_mixeval_details.ctp:14 -msgid "Scale Weight" +#: /Users/compass/projects/ipeer/src/views/elements/mixevals/questions_editor.ctp:30 +msgid "Paragraph Answer Question" msgstr "" -#: /views/elements/mixevals/view_mixeval_details.ctp:98 -msgid "Comments (No Weight on this Section)" +#: /Users/compass/projects/ipeer/src/views/elements/mixevals/questions_editor.ctp:34 +msgid "Sentence Answer Question" msgstr "" -#: /views/elements/mixevals/view_mixeval_details.ctp:123 -msgid "Mandatory?" +#: /Users/compass/projects/ipeer/src/views/elements/mixevals/questions_editor.ctp:38 +msgid "Score Dropdown Answer Question" msgstr "" -#: /views/elements/mixevals/view_mixeval_details.ctp:147 -msgid "Maximum 65535 characters." +#: /Users/compass/projects/ipeer/src/views/elements/mixevals/questions_editor.ctp:79 +msgid "Unrequired Likert questions are not counted toward the total rating." msgstr "" -#: /views/elements/mixevals/view_mixeval_details.ctp:155 -msgid "Respond Type?" +#: /Users/compass/projects/ipeer/src/views/elements/mixevals/questions_editor.ctp:108 +msgid "The increments on the drop-down will be based on 10 base points per member, the drop-down will go from 1 to (10 x No. of GroupMembers) in increments of 1
" msgstr "" -#: /views/elements/mixevals/view_mixeval_details.ctp:160 -#: /views/surveys/add_question.ctp:32 -msgid "Long Answer Text Input" +#: /Users/compass/projects/ipeer/src/views/elements/mixevals/questions_editor.ctp:131 +msgid "This mark will be scaled according to the response. E.g.: If there are 5 scale levels and this is set at 1, the lowest scale will be worth 0.2 marks, the second lowest 0.4 marks, and so on with the highest scale being worth the full 1 mark." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/mixevals/questions_editor.ctp:135 +msgid "This setting will hide/show the mark distribution to those taking the evaluation." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/mixevals/questions_editor.ctp:225 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:55 +msgid "Self-Evaluation Questions" msgstr "" -#: /views/elements/rubrics/ajax_rubric_edit.ctp:22 -#: /views/rubrics/edit.ctp:68 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_edit.ctp:22 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:96 msgid "Rubric Preview" msgstr "" -#: /views/elements/rubrics/ajax_rubric_edit.ctp:25 -#: /views/elements/rubrics/ajax_rubric_view.ctp:16 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_edit.ctp:25 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_view.ctp:23;92 msgid "Level of Mastery" msgstr "" -#: /views/elements/rubrics/ajax_rubric_edit.ctp:31 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_edit.ctp:31 msgid "Criteria Weight" msgstr "" -#: /views/elements/rubrics/ajax_rubric_edit.ctp:49 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_edit.ctp:45 +msgid "Show Marks" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_edit.ctp:52 msgid "Specific Comment" msgstr "" -#: /views/elements/rubrics/ajax_rubric_view.ctp:12 -msgid "Rubric View" +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_view.ctp:9 +msgid "required" msgstr "" -#: /views/elements/rubrics/ajax_rubric_view.ctp:33 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_view.ctp:40;124 msgid " mark(s)" msgstr "" -#: /views/elements/searchs/ajax_event_box.ctp:14 +#: /Users/compass/projects/ipeer/src/views/elements/rubrics/ajax_rubric_view.ctp:77 +msgid "General Comments" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/searchs/ajax_event_box.ctp:14 msgid " --- All events --- " msgstr "" -#: /views/elements/searchs/evaluation_result_search_panel.ctp:9 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_result_search_panel.ctp:9 msgid "Evaluation Result Search Panel" msgstr "" -#: /views/elements/searchs/evaluation_result_search_panel.ctp:36 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_result_search_panel.ctp:36 msgid "--- None ---" msgstr "" -#: /views/elements/searchs/evaluation_result_search_panel.ctp:37 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_result_search_panel.ctp:37 msgid "List Not Reviewed Evaluations" msgstr "" -#: /views/elements/searchs/evaluation_result_search_panel.ctp:38 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_result_search_panel.ctp:38 msgid "List Late Evaluations" msgstr "" -#: /views/elements/searchs/evaluation_result_search_panel.ctp:39 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_result_search_panel.ctp:39 msgid "List Ranged Mark Evaluations (set mark range below)" msgstr "" -#: /views/elements/searchs/evaluation_result_search_panel.ctp:54 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_result_search_panel.ctp:54 msgid "Result Mark(%)" msgstr "" -#: /views/elements/searchs/evaluation_result_search_panel.ctp:56 -#: /views/elements/searchs/evaluation_search_panel.ctp:30;48 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_result_search_panel.ctp:56 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_search_panel.ctp:30;48 msgid "FROM" msgstr "" -#: /views/elements/searchs/evaluation_result_search_panel.ctp:60 -#: /views/elements/searchs/evaluation_search_panel.ctp:35;52 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_result_search_panel.ctp:60 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_search_panel.ctp:35;52 msgid "TO" msgstr "" -#: /views/elements/searchs/evaluation_search_panel.ctp:11 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_search_panel.ctp:11 msgid "Evaluation Event Search Panel" msgstr "" -#: /views/elements/searchs/evaluation_search_panel.ctp:21 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_search_panel.ctp:21 msgid "Event Type" msgstr "" -#: /views/elements/searchs/evaluation_search_panel.ctp:23 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_search_panel.ctp:23 msgid "--- All Event Types ---" msgstr "" -#: /views/elements/searchs/evaluation_search_panel.ctp:45 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_search_panel.ctp:45 msgid "Release Date:" msgstr "" -#: /views/elements/searchs/evaluation_search_panel.ctp:58 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/evaluation_search_panel.ctp:58 msgid "specify a date range to search any event that are being released during that period of time." msgstr "" -#: /views/elements/searchs/instructor_search_panel.ctp:9 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/instructor_search_panel.ctp:9 msgid "Instructor Search Panel" msgstr "" -#: /views/elements/searchs/search_menu.ctp:6 -#: /views/evaluations/view_mixeval_evaluation_results.ctp:31 -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:156 -#: /views/evaluations/view_rubric_evaluation_results.ctp:5 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:12 -#: /views/evaluations/view_simple_evaluation_results.ctp:50 -msgid "Evaluation Results" -msgstr "" - -#: /views/elements/searchs/search_menu.ctp:7 +#: /Users/compass/projects/ipeer/src/views/elements/searchs/search_menu.ctp:7 msgid "Instructors" msgstr "" -#: /views/elements/survey_groups/ajax_survey_group_list.ctp:17 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_group_list.ctp:17 msgid "Release Now" msgstr "" -#: /views/elements/survey_groups/ajax_survey_group_list.ctp:24 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_group_list.ctp:24 msgid "Are you sure you want to delete survey group set" msgstr "" -#: /views/elements/survey_groups/ajax_survey_group_list.ctp:38 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_group_list.ctp:38 msgid "Confirm Survey Release" msgstr "" -#: /views/elements/survey_groups/ajax_survey_makegroups.ctp:14 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_makegroups.ctp:13 msgid "Team Making - Step One" msgstr "" -#: /views/elements/survey_groups/ajax_survey_makegroups.ctp:18 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_makegroups.ctp:16 msgid " students were specified for this survey, " msgstr "" -#: /views/elements/survey_groups/ajax_survey_makegroups.ctp:18 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_makegroups.ctp:16 msgid " students responded" msgstr "" -#: /views/elements/survey_groups/ajax_survey_makegroups.ctp:22 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_makegroups.ctp:21 msgid "Group Configuration" msgstr "" -#: /views/elements/survey_groups/ajax_survey_makegroups.ctp:27 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_makegroups.ctp:28 msgid "There must be at least one question." msgstr "" -#: /views/elements/survey_groups/ajax_survey_makegroups.ctp:53 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_makegroups.ctp:45 msgid "Gather
Similar" msgstr "" -#: /views/elements/survey_groups/ajax_survey_makegroups.ctp:53 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_makegroups.ctp:45 msgid "Ignore" msgstr "" -#: /views/elements/survey_groups/ajax_survey_makegroups.ctp:54 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_makegroups.ctp:46 msgid "Gather
Dissimilar" msgstr "" -#: /views/elements/survey_groups/ajax_survey_makegroups.ctp:60 +#: /Users/compass/projects/ipeer/src/views/elements/survey_groups/ajax_survey_makegroups.ctp:54 msgid "Note: It may take up to 10mins to create groups." msgstr "" -#: /views/elements/users/ajax_user_list.ctp:53 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:53 msgid "Are you sure you want to delete user" msgstr "" -#: /views/elements/users/ajax_user_list.ctp:61 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:61 msgid "Reset " msgstr "" -#: /views/elements/users/ajax_user_list.ctp:61 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:61 msgid "'s password" msgstr "" -#: /views/elements/users/ajax_user_list.ctp:63 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:63 msgid "Are you sure you want to reset password for user" msgstr "" -#: /views/elements/users/ajax_user_list.ctp:98 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:98 msgid "Prev " msgstr "" -#: /views/elements/users/ajax_user_list.ctp:102 +#: /Users/compass/projects/ipeer/src/views/elements/users/ajax_user_list.ctp:102 msgid " Next" msgstr "" -#: /views/elements/users/user_summary_list.ctp:8 +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:5 +msgid "%s Account" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:11 +msgid "User" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/users/merge_search.ctp:11 +msgid "-- Search for the %s account --" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/elements/users/user_summary_list.ctp:8 msgid "E-mail" msgstr "" -#: /views/email_templates/add.ctp:13 -#: /views/email_templates/edit.ctp:13 -#: /views/mixevals/edit.ctp:43 -#: /views/rubrics/edit.ctp:35 -#: /views/simple_evaluations/edit.ctp:53 +#: /Users/compass/projects/ipeer/src/views/email_templates/add.ctp:13 +#: /Users/compass/projects/ipeer/src/views/email_templates/edit.ctp:13 +#: /Users/compass/projects/ipeer/src/views/mixevals/add.ctp:22 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:34 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/edit.ctp:42 +#: /Users/compass/projects/ipeer/src/views/surveys/edit.ctp:22 msgid "Private" msgstr "" -#: /views/email_templates/add.ctp:14 -#: /views/email_templates/edit.ctp:14 -#: /views/evaltools/index.ctp:6;28;54 -#: /views/mixevals/edit.ctp:43 -#: /views/rubrics/edit.ctp:35 -#: /views/simple_evaluations/edit.ctp:53 +#: /Users/compass/projects/ipeer/src/views/email_templates/add.ctp:14 +#: /Users/compass/projects/ipeer/src/views/email_templates/edit.ctp:14 +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:6;28;54;80;101 +#: /Users/compass/projects/ipeer/src/views/mixevals/add.ctp:22 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:34 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/edit.ctp:42 +#: /Users/compass/projects/ipeer/src/views/surveys/edit.ctp:22 msgid "Public" msgstr "" -#: /views/email_templates/add.ctp:25 -#: /views/email_templates/edit.ctp:25 -#: /views/email_templates/view.ctp:24 -#: /views/emailer/write.ctp:134 +#: /Users/compass/projects/ipeer/src/views/email_templates/add.ctp:19 +#: /Users/compass/projects/ipeer/src/views/email_templates/edit.ctp:19 +msgid "Public lets you share this email template with other instructors." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/email_templates/add.ctp:28 +#: /Users/compass/projects/ipeer/src/views/email_templates/edit.ctp:28 +#: /Users/compass/projects/ipeer/src/views/email_templates/view.ctp:24 +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:134 msgid "-- Select Merge Field --" msgstr "" -#: /views/emailer/view.ctp:29 -msgid "Scheduled on" +#: /Users/compass/projects/ipeer/src/views/emailer/view.ctp:6 +msgid "To" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/view.ctp:24 +msgid "Scheduled on" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/view.ctp:36 +msgid "Content" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:16 +msgid "Add Additional Recipient" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:23 +msgid "Please select a recipient!" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:51 +msgid "Single Email" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:52 +msgid "Multiple Emails" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:64 +msgid "(send " +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:72 +msgid " times, with " +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:79 +msgid "minute(s)" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:80 +msgid "hour(s)" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:81 +msgid "day(s)" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/emailer/write.ctp:98 +msgid "-- No Template --" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/errors/missing_connection.ctp:2 +msgid "No iPeer database found. You may want to run installation first. Otherwise make sure you define in it app/config/database.php in the following format:" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/errors/missing_connection.ctp:15 +msgid "For more details, also see this file:" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/errors/permission_denied.ctp:2 +msgid "Access Denied" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/errors/permission_denied.ctp:4 +msgid "You don't have permission to access this page." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/errors/permission_denied.ctp:5 +msgid "Click here to go back" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:7 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/view.ctp:16 +msgid "Base Point Per Member" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:125 +msgid "My Simple Evaluations" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:126 +msgid "All Simple Evaluations" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:137 +msgid "My Rubrics Evaluations" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:138 +msgid "All Rubric Evaluations" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:149 +msgid "My Mixed Evaluations" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:150 +#: /Users/compass/projects/ipeer/src/views/mixevals/index.ctp:4 +msgid "Add Mixed Evaluation" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:150 +msgid "All Mixed Evaluations" msgstr "" -#: /views/emailer/view.ctp:35 -msgid "Sent?" +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:161 +msgid "My Surveys" msgstr "" -#: /views/emailer/view.ctp:43 -msgid "Content" +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:162 +msgid "Add Survey" msgstr "" -#: /views/emailer/view.ctp:56 -msgid "Created:" +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:162 +msgid "All Surveys" msgstr "" -#: /views/emailer/write.ctp:16 -msgid "Add Additional Recipient" +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:173 +msgid "My Email Templates" msgstr "" -#: /views/emailer/write.ctp:23 -msgid "Please select a recipient!" +#: /Users/compass/projects/ipeer/src/views/evaltools/index.ctp:174 +msgid "All Email Templates" msgstr "" -#: /views/emailer/write.ctp:51 -msgid "Single Email" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:4 +msgid "Give the export file a name, which is default to today's date." msgstr "" -#: /views/emailer/write.ctp:52 -msgid "Multiple Emails" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:5 +msgid "Choose one of the two export formats." msgstr "" -#: /views/emailer/write.ctp:64 -msgid "(send " +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:6 +msgid "Please check at least one from each similarly coloured group." msgstr "" -#: /views/emailer/write.ctp:72 -msgid " times, with " +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:7 +msgid "Dropped Students that have evaluated or have been evaluated are marked with an asterisk (*)" msgstr "" -#: /views/emailer/write.ctp:79 -msgid "minute(s)" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:9;82 +#: /Users/compass/projects/ipeer/src/views/survey_groups/export.ctp:8;24 +msgid "Export" msgstr "" -#: /views/emailer/write.ctp:80 -msgid "hour(s)" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:14 +#: /Users/compass/projects/ipeer/src/views/survey_groups/export.ctp:12 +msgid "Export Filename" msgstr "" -#: /views/emailer/write.ctp:81 -msgid "day(s)" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:18 +msgid "Export File Type" msgstr "" -#: /views/emailer/write.ctp:98 -msgid "-- No Template --" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:27 +msgid "Include All Evaluations" msgstr "" -#: /views/errors/missing_connection.ctp:2 -msgid "No iPeer database found. You may want to run installation first. Otherwise make sure you define in it app/config/database.php in the following format:" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:30 +msgid "Evaluation Information" msgstr "" -#: /views/errors/missing_connection.ctp:15 -msgid "For more details, also see this file:" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:34 +msgid "Include Course Name" msgstr "" -#: /views/errors/permission_denied.ctp:2 -msgid "Access Denied" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:38 +msgid "Include Event Name" msgstr "" -#: /views/errors/permission_denied.ctp:4 -msgid "You don't have permission to access this page." +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:41 +msgid "Please include at least one of the red fields" msgstr "" -#: /views/errors/permission_denied.ctp:5 -msgid "Click here to go back" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:45 +msgid "Include Evaluation Type" msgstr "" -#: /views/evaltools/index.ctp:7 -#: /views/simple_evaluations/view.ctp:16 -msgid "Base Point Per Member" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:48 +msgid "Group and Result" msgstr "" -#: /views/evaltools/index.ctp:55 -msgid "Lickert Scale Questions" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:52 +msgid "Include Group Names" msgstr "" -#: /views/evaltools/index.ctp:56 -msgid "Prefill Questions" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:56 +msgid "Include Student Name" msgstr "" -#: /views/evaltools/index.ctp:147 -msgid "Add Survey" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:61 +msgid "Include Student Id" msgstr "" -#: /views/evaltools/index.ctp:156 -msgid "Email Templates" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:65 +msgid "Please include at least one of the green fields" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:20 -#: /views/evaluations/rubric_eval_form.ctp:19 -msgid "Evaluator:" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:69 +msgid "Include Comments" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:22 -#: /views/evaluations/rubric_eval_form.ctp:21 -msgid "Evaluating:" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:73 +msgid "Include Grades" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:26 -#: /views/evaluations/rubric_eval_form.ctp:25 -msgid "Event Name:" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:76 +msgid "Please include at least one of the orange fields" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:28 -#: /views/evaluations/rubric_eval_form.ctp:27 -msgid "Due Date:" +#: /Users/compass/projects/ipeer/src/views/evaluations/export.ctp:80 +msgid "Include Final Marks" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:32 -#: /views/evaluations/rubric_eval_form.ctp:31 -msgid "Description:" +#: /Users/compass/projects/ipeer/src/views/evaluations/mixeval_eval_form.ctp:7 +msgid "Notes" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:39 -msgid "Click your peer's name to rate his/her performance." +#: /Users/compass/projects/ipeer/src/views/evaluations/mixeval_eval_form.ctp:10 +msgid "The evaluation is due on %s." msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:40 -msgid "(Must)" +#: /Users/compass/projects/ipeer/src/views/evaluations/mixeval_eval_form.ctp:11 +msgid "To resubmit an evaluation, all required questions must be answered." msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:41 -#: /views/evaluations/rubric_eval_form.ctp:40 -msgid "Press \"Save This Section\" or \"Edit This Section\" once to save the evaluation on individual peer." +#: /Users/compass/projects/ipeer/src/views/evaluations/mixeval_eval_form.ctp:13 +msgid "The evaluation can be repeatedly submitted until " msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:42 -msgid "Press \"Submit to Complete the Evaluation\" to submit your evaluation to all peers." +#: /Users/compass/projects/ipeer/src/views/evaluations/mixeval_eval_form.ctp:14 +msgid " marks required questions." msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:91 -msgid "Partially" +#: /Users/compass/projects/ipeer/src/views/evaluations/mixeval_eval_form.ctp:16 +msgid "Show/Hide Late Penalty Policy" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:95 -msgid "Entered" +#: /Users/compass/projects/ipeer/src/views/evaluations/mixeval_eval_form.ctp:24 +msgid "%s is deducted afterwards." msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:97 -msgid "Incomplete" +#: /Users/compass/projects/ipeer/src/views/evaluations/mixeval_eval_form.ctp:73 +msgid "Submit the Evaluation" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:119 -msgid "Edit This Section (Click this button to save now or you may lose your input)" +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:65 +msgid "Evaluator:" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:121 -msgid "Save This Section (Click this button to save now or you may lose your input)" +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:67 +msgid "Evaluating:" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:186;188 -#: /views/evaluations/rubric_eval_form.ctp:152;154 -msgid "Submit to Complete the Evaluation" +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:71 +msgid "Event Name:" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:189 -msgid "Please complete the questions for all group members, pressing 'Save This Section' button for each one." +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:73 +msgid "Due Date:" msgstr "" -#: /views/evaluations/mixeval_eval_form.ctp:190 -msgid "Please Enter all the comments for all the group members before submitting." +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:77 +msgid "Description:" msgstr "" -#: /views/evaluations/rubric_eval_form.ctp:38 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:84 msgid "Click EACH of your peer's name to rate his/her performance." msgstr "" -#: /views/evaluations/rubric_eval_form.ctp:39 -msgid "Must" +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:86 +msgid "Press \"Save This Section\" to save the evaluation for each group member." msgstr "" -#: /views/evaluations/rubric_eval_form.ctp:41 -msgid "Press \"Submit to Complete the Evaluation\" to submit your evlauation to all peers." +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:87 +msgid "Press \"Submit to Complete the Evaluation\" to submit your evaluation to all peers." msgstr "" -#: /views/evaluations/rubric_eval_form.ctp:42 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:88 msgid "NOTE: You can click the \"Submit to Complete the Evaluation\" button only AFTER all evaluations are completed." msgstr "" -#: /views/evaluations/rubric_eval_form.ctp:75 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:148;209;253 msgid "(click to expand)" msgstr "" -#: /views/evaluations/rubric_eval_form.ctp:79 -msgid "Important! Comments are required in this evaluation." +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:161;222;278 +msgid "Please complete all the questions marked red before saving." msgstr "" -#: /views/evaluations/rubric_eval_form.ctp:89 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:162;223 msgid "Make sure you save this section before moving on to the other ones!" msgstr "" -#: /views/evaluations/rubric_eval_form.ctp:155 +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:276 +msgid "This section will be available once the previous sections are completed." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:307;309 +msgid "Submit to Complete the Evaluation" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:310 msgid "Please complete the questions for all group members, pressing 'Save This Section' button for each one." msgstr "" -#: /views/evaluations/rubric_eval_form.ctp:156 -msgid "Please Enter all the comments for all the group members before submitting." +#: /Users/compass/projects/ipeer/src/views/evaluations/rubric_eval_form.ctp:311 +msgid "Please enter all the comments for all the group members before submitting." msgstr "" -#: /views/evaluations/student_view_mixeval_evaluation_results.ctp:81 -#: /views/evaluations/student_view_rubric_evaluation_results.ctp:65 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_rubric_evaluation_results.ctp:48 msgid "Evaluation Results From Your Teammates. (Randomly Ordered)" msgstr "" -#: /views/evaluations/student_view_mixeval_evaluation_results.ctp:85 -#: /views/evaluations/student_view_rubric_evaluation_results.ctp:70 -msgid "Grades Not Released Yet." +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_rubric_evaluation_results.ctp:51 +msgid "Comments/Grades Not Released Yet." msgstr "" -#: /views/evaluations/student_view_mixeval_evaluation_results.ctp:87 -#: /views/evaluations/student_view_rubric_evaluation_results.ctp:72 -msgid "Comments Not Released Yet." +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_rubric_evaluation_results.ctp:53 +msgid "Grades Not Released Yet." msgstr "" -#: /views/evaluations/student_view_mixeval_evaluation_results.ctp:101 -msgid "Review Evaluations From You." +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_rubric_evaluation_results.ctp:55 +msgid "Comments Not Released Yet." msgstr "" -#: /views/evaluations/student_view_simple_evaluation_results.ctp:63 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:68 msgid "Randomly Ordered" msgstr "" -#: /views/evaluations/student_view_simple_evaluation_results.ctp:75 +#: /Users/compass/projects/ipeer/src/views/evaluations/student_view_simple_evaluation_results.ctp:82 msgid "Not Released." msgstr "" -#: /views/evaluations/view.ctp:13 +#: /Users/compass/projects/ipeer/src/views/evaluations/view.ctp:14 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:175 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:186 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:72;275 +msgid "Auto Release is ON, you do not need to manually release the grades and comments" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaluations/view.ctp:19 msgid " Export Evaluations" msgstr "" -#: /views/evaluations/view.ctp:14 +#: /Users/compass/projects/ipeer/src/views/evaluations/view.ctp:20 msgid "Release All Comments" msgstr "" -#: /views/evaluations/view.ctp:15 +#: /Users/compass/projects/ipeer/src/views/evaluations/view.ctp:21 msgid "Unrelease All Comments" msgstr "" -#: /views/evaluations/view.ctp:16 +#: /Users/compass/projects/ipeer/src/views/evaluations/view.ctp:22 msgid "Release All Grades" msgstr "" -#: /views/evaluations/view.ctp:17 +#: /Users/compass/projects/ipeer/src/views/evaluations/view.ctp:23 msgid "Unrelease All Grades" msgstr "" -#: /views/evaluations/view.ctp:24 +#: /Users/compass/projects/ipeer/src/views/evaluations/view.ctp:30 msgid "Back to Evaluation Event Listing" msgstr "" -#: /views/evaluations/view.ctp:27 +#: /Users/compass/projects/ipeer/src/views/evaluations/view.ctp:33 msgid "Back to Course Home" msgstr "" -#: /views/evaluations/view_group_submission_details.ctp:29 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_group_submission_details.ctp:29 msgid "(not submitted)" msgstr "" -#: /views/evaluations/view_group_submission_details.ctp:33 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_group_submission_details.ctp:33 msgid " day(s)" msgstr "" -#: /views/evaluations/view_group_submission_details.ctp:36 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_group_submission_details.ctp:36 msgid "(on time)" msgstr "" -#: /views/evaluations/view_group_submission_details.ctp:48 -msgid "Date Submitted" -msgstr "" - -#: /views/evaluations/view_group_submission_details.ctp:49 -msgid "Late By" -msgstr "" - -#: /views/evaluations/view_mixeval_evaluation_results.ctp:34 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:27 -msgid "Student Name:" -msgstr "" - -#: /views/evaluations/view_mixeval_evaluation_results.ctp:35 -msgid "Total:" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_group_submission_details.ctp:47 +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:12 +msgid "Student Number" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results.ctp:43 -msgid "Group Average:" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_group_submission_details.ctp:48 +msgid "Date Submitted" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results.ctp:57 -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:147 -#: /views/evaluations/view_rubric_evaluation_results.ctp:58 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:140 -#: /views/evaluations/view_simple_evaluation_results.ctp:266 -msgid "Mark Peer Evaluations as Not Reviewed" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_group_submission_details.ctp:49 +msgid "Late By" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results.ctp:59 -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:149 -#: /views/evaluations/view_rubric_evaluation_results.ctp:60 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:142 -#: /views/evaluations/view_simple_evaluation_results.ctp:269 -msgid "Mark Peer Evaluations as Reviewed" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results.ctp:20 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:32 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results.ctp:10 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:19 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:33 +msgid "Have not submitted their evaluations" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:37 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:37 -msgid "Total:( /" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results.ctp:54 +msgid "Question" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:133 -#: /views/evaluations/view_rubric_evaluation_results.ctp:40 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:126 -msgid "Group Average: " +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results.ctp:55 +msgid "Average Grade Per Question" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:173 -msgid "(Number of Evaluator(s): " +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results.ctp:69 +msgid "Student Name:" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:174 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:164 -msgid "Final Total: " +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results.ctp:70 +msgid "Total:" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:190 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:178 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:120 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:105 msgid "Same Mark as Group Average" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:192 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:180 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:122 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:107 msgid "Below Group Average" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:194 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:182 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:124 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:109 msgid "Above Group Average" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:197 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:184 -msgid "Average Percentage Per Question: " -msgstr "" - -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:201 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:131 msgid "NOTE: " msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:202 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:132 msgid " Late Penalty" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:209 -msgid "Section One:" -msgstr "" - -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:241 -msgid "Points:" -msgstr "" - -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:323 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:271 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:162 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:171 msgid "Unrelease Grades" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:325 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:273 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:164 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:173 msgid "Release Grades" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:330 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:278 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:169 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:178 msgid "Unrelease Comments" msgstr "" -#: /views/evaluations/view_mixeval_evaluation_results_detail.ctp:332 -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:280 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_mixeval_evaluation_results_detail.ctp:171 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:180 msgid "Release Comments" msgstr "" -#: /views/evaluations/view_rubric_evaluation_results.ctp:8 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results.ctp:37 msgid "Student Name" msgstr "" -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:155 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results.ctp:68 +msgid "Group Average: " +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:57 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:255 +#: /Users/compass/projects/ipeer/src/views/helpers/evaluation.php:250 +msgid "Mark Peer Evaluations as Not Reviewed" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:59 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:258 +#: /Users/compass/projects/ipeer/src/views/helpers/evaluation.php:252 +msgid "Mark Peer Evaluations as Reviewed" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:82 msgid "Evaluatee: " msgstr "" -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:163 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:89 msgid " (Number of Evaluator(s): " msgstr "" -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:236 -msgid "Grade:" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:90 +msgid "Final Total: " msgstr "" -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:244 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:152 msgid "Comment:" msgstr "" -#: /views/evaluations/view_rubric_evaluation_results_detail.ctp:259 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:160 msgid "General Comment:" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:56 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_rubric_evaluation_results_detail.ctp:195 +msgid "No submissions have been made." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:81 msgid "Members Evaluated" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:125 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:147 msgid "Penalty" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:150 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:168 msgid "Final Mark" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:171 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:183 msgid "# of Evaluator(s)" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:198 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:198 msgid "Average Received" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:237 +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:217 msgid "Grade Release" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:252 -msgid "marks n/a" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:269 +msgid "Comment Sections" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:280 -msgid "Comment Sections" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:272 +msgid "Check the \"Released\" checkbox and click \"Save Changes\" to release individual comments , or" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:281 -#: /views/groups/import.ctp:3 -#: /views/users/import.ctp:2 -msgid "Instructions" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:273 +msgid "Click \"Release All\" or \"Unrelease All\" buttons to release or unrelease all comments." msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:283 -msgid "Check the \"Released\" checkbox and click \"Save Changes\" to release individual comments , or" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:332 +msgid "Save Changes" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:284 -msgid "Click \"Release All\" or \"Unrelease All\" buttons to release or unrelease all comments." +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:333 +msgid "Release All" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:293 -msgid "Evaluatee" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_simple_evaluation_results.ctp:334 +msgid "Unrelease All" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:311 -msgid "No Comments" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_survey_summary.ctp:13;33 +msgid "responses" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:332 -msgid "Save Changes" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_survey_summary.ctp:43 +msgid "Responders" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:333 -msgid "Release All" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_survey_summary.ctp:86 +msgid "Result" msgstr "" -#: /views/evaluations/view_simple_evaluation_results.ctp:334 -msgid "Unrelease All" +#: /Users/compass/projects/ipeer/src/views/evaluations/view_survey_summary.ctp:91 +msgid "Not Submitted" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/events/add.ctp:37 +#: /Users/compass/projects/ipeer/src/views/events/edit.ctp:68 +msgid "Doesn't apply to Mix Evaluation. Required questions are set in the template." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/events/add.ctp:56 +#: /Users/compass/projects/ipeer/src/views/events/edit.ctp:87 +msgid "Basic view only show averages of questions" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/events/add.ctp:75 +#: /Users/compass/projects/ipeer/src/views/events/edit.ctp:107 +msgid "Select the number of days in between each email reminder for submitting\n evaluations. The first email is sent when the event is released." msgstr "" -#: /views/evaluations/view_survey_summary.ctp:2 -msgid "Team Maker Survey Summary" +#: /Users/compass/projects/ipeer/src/views/events/add.ctp:84 +#: /Users/compass/projects/ipeer/src/views/events/edit.ctp:116 +msgid "Holding \"ctrl\" or \"command\" key to select multiple groups." msgstr "" -#: /views/events/view.ctp:20 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:20 msgid "Evaluation Format" msgstr "" -#: /views/events/view.ctp:26 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:26 msgid "Evaluation" msgstr "" -#: /views/events/view.ctp:32 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:32 msgid "Allow Self-Evaluation?" msgstr "" -#: /views/events/view.ctp:38 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:38 msgid "Require Student Comments?" msgstr "" -#: /views/events/view.ctp:46 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:42 +msgid "Auto-Release Results?" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:48 +msgid "Student Result Mode" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:58 msgid "Evaluation Release Date" msgstr "" -#: /views/events/view.ctp:50;69 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:62;81 msgid "FROM:" msgstr "" -#: /views/events/view.ctp:56;75 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:68;87 msgid "TO:" msgstr "" -#: /views/events/view.ctp:65 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:77 msgid "Result Release Date" msgstr "" -#: /views/events/view.ctp:84 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:96 msgid "Late Penalty" msgstr "" -#: /views/events/view.ctp:103 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:115 msgid "Groups Assignment" msgstr "" -#: /views/events/view.ctp:114 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:126 msgid "Edit this Event" msgstr "" -#: /views/events/view.ctp:115 +#: /Users/compass/projects/ipeer/src/views/events/view.ctp:127 msgid "Back to Event Listing" msgstr "" -#: /views/faculties/add.ctp:8 +#: /Users/compass/projects/ipeer/src/views/faculties/add.ctp:8 msgid "Create" msgstr "" -#: /views/faculties/index.ctp:4 +#: /Users/compass/projects/ipeer/src/views/faculties/index.ctp:4 msgid "Add Faculty" msgstr "" -#: /views/faculties/view.ctp:3 -msgid "Departments" -msgstr "" - -#: /views/faculties/view.ctp:37 -msgid "Admins" +#: /Users/compass/projects/ipeer/src/views/faculties/view.ctp:37 +msgid "Admins/Instructors" msgstr "" -#: /views/groups/edit.ctp:26 +#: /Users/compass/projects/ipeer/src/views/groups/edit.ctp:24 msgid "Filtered Students" msgstr "" -#: /views/groups/edit.ctp:26 +#: /Users/compass/projects/ipeer/src/views/groups/edit.ctp:24 msgid "Students in Group" msgstr "" -#: /views/groups/edit.ctp:29 -msgid "Note: Students already in one or more groups are marked" -msgstr "" - -#: /views/groups/edit.ctp:30 -msgid "with * and are listed under those without groups" +#: /Users/compass/projects/ipeer/src/views/groups/edit.ctp:27 +msgid "Note: Students already in one or more groups are marked with *" msgstr "" -#: /views/groups/edit.ctp:34 -#: /views/groups/export.ctp:52 +#: /Users/compass/projects/ipeer/src/views/groups/edit.ctp:31 +#: /Users/compass/projects/ipeer/src/views/groups/export.ctp:54 msgid " Group" msgstr "" -#: /views/groups/export.ctp:45 +#: /Users/compass/projects/ipeer/src/views/groups/export.ctp:47 msgid "Available Groups" msgstr "" -#: /views/groups/export.ctp:45 +#: /Users/compass/projects/ipeer/src/views/groups/export.ctp:47 msgid "Participating Groups" msgstr "" -#: /views/groups/import.ctp:4 -#: /views/users/import.ctp:25;32 -msgid "Import" +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:4 +msgid "Please make sure to remove the header in CSV file." msgstr "" -#: /views/groups/import.ctp:10 -msgid "Please make sure the username column matches the username column in student import file." +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:5 +msgid "All fields are mandatory. The system will generate the group numbers." msgstr "" -#: /views/groups/import.ctp:11 -msgid "Please make sure to remove the header in CSV file." +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:6 +msgid "All group names must be unique within the class." msgstr "" -#: /views/groups/import.ctp:12 -msgid "All columns are required." +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:7 +msgid "The student identifiers that can be used are usernames or student numbers." msgstr "" -#: /views/groups/import.ctp:15 -msgid "Format" +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:8 +msgid "Please make sure the column matches the username/student number in the students' profile" msgstr "" -#: /views/groups/import.ctp:17 -msgid "Username, Group#, and Group Name" +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:11 +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:12 +msgid "Formatting:" msgstr "" -#: /views/groups/import.ctp:20 -msgid "Example" +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:13 +msgid "Student Identifier, Group Name" msgstr "" -#: /views/groups/import.ctp:22;23 +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:18;19 msgid "Team A" msgstr "" -#: /views/groups/import.ctp:24;25 +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:20;21 msgid "Team B" msgstr "" -#: /views/groups/import.ctp:30 -msgid "Please select a CSV file to import" -msgstr "" - -#: /views/groups/import.ctp:32 -msgid "Browse" -msgstr "" - -#: /views/groups/import.ctp:36 -msgid "Select the course to import into" +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:24;41 +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:25;35 +msgid "Import" msgstr "" -#: /views/groups/import.ctp:39 -msgid "Click the button below to Create the Groups" +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:35 +msgid "The student identifier used in the CSV file." msgstr "" -#: /views/groups/import.ctp:41 -msgid "Import Group CSV" +#: /Users/compass/projects/ipeer/src/views/groups/import.ctp:40 +msgid "Update group members for existing groups." msgstr "" -#: /views/groups/import_results.ctp:6 +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:2 msgid "The group CSV file was processed." msgstr "" -#: /views/groups/import_results.ctp:7 -msgid "Click OK to return\n to the list of groups, or look below for the results of the import." -msgstr "" - -#: /views/groups/import_results.ctp:14 -msgid "Group Import Results" -msgstr "" - -#: /views/groups/import_results.ctp:16 -msgid "Group Creation" -msgstr "" - -#: /views/groups/import_results.ctp:20 -msgid "Groups Created" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:3 +msgid "Click OK to return to the list of groups, or look below\nfor the results of the import." msgstr "" -#: /views/groups/import_results.ctp:22 -msgid "Groups Skipped" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:9 +msgid "Invalid Entries" msgstr "" -#: /views/groups/import_results.ctp:24 -msgid "Errors in Groups" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:10 +msgid "There are more or less than 2 columns." msgstr "" -#: /views/groups/import_results.ctp:29 -msgid "No groups Listed" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:11 +msgid "Entry" msgstr "" -#: /views/groups/import_results.ctp:48 -msgid "User->Group Assignment" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:18 +msgid "Groups Created" msgstr "" -#: /views/groups/import_results.ctp:52 -msgid "Users Added To Groups" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:26 +msgid "Groups that could not be created." msgstr "" -#: /views/groups/import_results.ctp:54 -msgid "Entries Skipped" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:34 +msgid "Students Placed" msgstr "" -#: /views/groups/import_results.ctp:56 -msgid "Errors in Entries" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:35;53 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:50 +msgid "Student" msgstr "" -#: /views/groups/import_results.ctp:60 -msgid "No Students Listed" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:46 +msgid "Students Not Placed" msgstr "" -#: /views/groups/import_results.ctp:79 -msgid "Error." +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:47 +msgid "Possible Reasons:" msgstr "" -#: /views/groups/import_results.ctp:79 -msgid "See the 'Result:' line for details" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:49 +msgid "The student identifier does not exist in the system. Please add them first." msgstr "" -#: /views/groups/import_results.ctp:82 -msgid "Entry" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:50 +msgid "The student is not enrolled in the course. Please enrol them first." msgstr "" -#: /views/groups/import_results.ctp:86 -msgid "Result" +#: /Users/compass/projects/ipeer/src/views/groups/import_results.ctp:51 +msgid "The group was unable to be created or does not exist." msgstr "" -#: /views/groups/index.ctp:5 +#: /Users/compass/projects/ipeer/src/views/groups/index.ctp:6 msgid " Import Group(s)" msgstr "" -#: /views/groups/view.ctp:32 +#: /Users/compass/projects/ipeer/src/views/groups/view.ctp:23 msgid "Email to " msgstr "" -#: /views/groups/view.ctp:52 +#: /Users/compass/projects/ipeer/src/views/groups/view.ctp:43 msgid " Email To All Members" msgstr "" -#: /views/groups/view.ctp:66 +#: /Users/compass/projects/ipeer/src/views/groups/view.ctp:57 msgid "Edit this Group" msgstr "" -#: /views/groups/view.ctp:67 +#: /Users/compass/projects/ipeer/src/views/groups/view.ctp:58 msgid "Back to Group Listing" msgstr "" -#: /views/home/index.ctp:74 +#: /Users/compass/projects/ipeer/src/views/home/index.ctp:31 +msgid "%d unreviewed group evaluations" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/home/index.ctp:70 msgid "You do not have any courses." msgstr "" -#: /views/home/index.ctp:79 +#: /Users/compass/projects/ipeer/src/views/home/index.ctp:75 msgid "Short Help" msgstr "" -#: /views/home/index.ctp:84 +#: /Users/compass/projects/ipeer/src/views/home/index.ctp:80 msgid "To use iPeer you have to add a course." msgstr "" -#: /views/home/index.ctp:86 -msgid "Please add a course from the yellow \"Courses\" tab above" +#: /Users/compass/projects/ipeer/src/views/home/index.ctp:82 +msgid "Please add a course from the \"Courses\" tab above" msgstr "" -#: /views/home/index.ctp:89 -msgid "Then register students into that course from that course's summary display. This display will be available (once the course is created) by clicking on the course's name from most menus." +#: /Users/compass/projects/ipeer/src/views/home/index.ctp:85 +msgid "Then register students into that course from that course's home page. This display will be available (once the course is created) by clicking on the course's name from most menus." msgstr "" -#: /views/home/index.ctp:92 +#: /Users/compass/projects/ipeer/src/views/home/index.ctp:88 msgid "Put your students into groups manually, (or, if you have the students complete a survey, iPeer can do it for you, using TeamMaker)." msgstr "" -#: /views/home/index.ctp:96 -msgid "To create evaluations, check out the orange wizard link the top right hand corner \"iPeer Tutorial Wizard\"." -msgstr "" - -#: /views/home/index.ctp:97 -msgid "It has detailed video clips on how to create evaluations." +#: /Users/compass/projects/ipeer/src/views/home/index.ctp:92 +msgid "To create evaluations, check out the " msgstr "" -#: /views/install/index.ctp:116 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:131 msgid "PHP version" msgstr "" -#: /views/install/index.ctp:120 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:135 msgid "MySQL support" msgstr "" -#: /views/install/index.ctp:124 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:140 msgid "Directory app/config writable " msgstr "" -#: /views/install/index.ctp:128 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:144 msgid "File app/config/database.php writable " msgstr "" -#: /views/install/index.ctp:132 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:149 msgid "magic_quotes_gpc is off " msgstr "" -#: /views/install/index.ctp:136 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:153 msgid "Guard Plugin" msgstr "" -#: /views/install/index.ctp:137 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:154 msgid "If you cloned iPeer from git, you may need to run git submodule init and git submodule update." msgstr "" -#: /views/install/index.ctp:147 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:164 msgid "Sendmail or Sendmail Wrapper" msgstr "" -#: /views/install/index.ctp:148 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:165 msgid "Required if you want email functions." msgstr "" -#: /views/install/index.ctp:153 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:170 msgid "Permissions for email scheduling." msgstr "" -#: /views/install/index.ctp:154 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:171 msgid "If failed, remove Apache user from \"/etc/at.deny\" or \"/var/at/at.deny\"" msgstr "" -#: /views/install/index.ctp:159 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:176 msgid "PHP LDAP Extension." msgstr "" -#: /views/install/index.ctp:160 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:177 msgid "Required if you are planning to use LDAP authentication." msgstr "" -#: /views/install/index.ctp:169 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:182 +msgid "PHP DOMDocument." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:183 +msgid "Required if you are planning to use TeamMaker." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:192 +msgid "PHP memory limit at least 64 MB" +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:193 +msgid "Some operations, such as export, requires more memory when dealing with large courses." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:200 msgid "PHP Directive" msgstr "" -#: /views/install/index.ctp:170 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:201 msgid "Recommended" msgstr "" -#: /views/install/index.ctp:171 +#: /Users/compass/projects/ipeer/src/views/install/index.ctp:202 msgid "Actual" msgstr "" -#: /views/install/install2.ctp:21 +#: /Users/compass/projects/ipeer/src/views/install/install2.ctp:21 msgid " is Free Software released under the GNU/GPL License." msgstr "" -#: /views/install/install3.ctp:3 +#: /Users/compass/projects/ipeer/src/views/install/install3.ctp:3 msgid "Step 3: iPeer Database Configuration" msgstr "" -#: /views/install/install3.ctp:12 +#: /Users/compass/projects/ipeer/src/views/install/install3.ctp:12 msgid "Data Setup Option" msgstr "" -#: /views/install/install3.ctp:38 +#: /Users/compass/projects/ipeer/src/views/install/install3.ctp:38 msgid "MySQL Database Configuration Parameters" msgstr "" -#: /views/install/install4.ctp:2 +#: /Users/compass/projects/ipeer/src/views/install/install4.ctp:2 msgid "Step 4: System Parameters Configuration" msgstr "" -#: /views/install/install5.ctp:9 +#: /Users/compass/projects/ipeer/src/views/install/install5.ctp:9 msgid "Important!" msgstr "" -#: /views/install/install5.ctp:10 +#: /Users/compass/projects/ipeer/src/views/install/install5.ctp:10 msgid "For security reasons, please set the configuration directory (%s) and database.php (%s) back to read only." msgstr "" -#: /views/install/install5.ctp:13 +#: /Users/compass/projects/ipeer/src/views/install/install5.ctp:13 msgid "If you opted to install with example data, you can login to the example user accounts with the password 'ipeeripeer'" msgstr "" -#: /views/layouts/tutorial_pop_up.ctp:4 +#: /Users/compass/projects/ipeer/src/views/layouts/tutorial_pop_up.ctp:4 msgid "iPeer V2 with TeamMaker" msgstr "" -#: /views/mixevals/edit.ctp:47 -msgid "Public Allows Mixed Evaluation Sharing Amongst Instructors" -msgstr "" - -#: /views/mixevals/edit.ctp:52 -#: /views/rubrics/edit.ctp:44 -msgid "Zero Mark" -msgstr "" - -#: /views/mixevals/edit.ctp:55 -msgid "No Marks Given for Level of Scale of 1" -msgstr "" - -#: /views/mixevals/edit.ctp:75 -msgid "Mixed Evaluation Editor" +#: /Users/compass/projects/ipeer/src/views/mixevals/add.ctp:15 +msgid "Info" msgstr "" -#: /views/mixevals/index.ctp:4 -msgid "Add Mix Evaluation" +#: /Users/compass/projects/ipeer/src/views/mixevals/add.ctp:26 +#: /Users/compass/projects/ipeer/src/views/mixevals/view.ctp:11 +msgid "Public lets you share this mixed evaluation with other instructors." msgstr "" -#: /views/oauth_clients/index.ctp:6 -msgid "Add Client" +#: /Users/compass/projects/ipeer/src/views/mixevals/add.ctp:29 +#: /Users/compass/projects/ipeer/src/views/mixevals/view.ctp:19 +msgid "Start marks from zero for all Likert questions." msgstr "" -#: /views/oauth_tokens/index.ctp:5 -msgid "Add Token" +#: /Users/compass/projects/ipeer/src/views/mixevals/add.ctp:35 +msgid "Adds a reflective questions section for evaluators." msgstr "" -#: /views/oauth_tokens/view.ctp:2 -msgid "Oauth Token" +#: /Users/compass/projects/ipeer/src/views/mixevals/add.ctp:50 +#: /Users/compass/projects/ipeer/src/views/survey_groups/edit.ctp:98 +#: /Users/compass/projects/ipeer/src/views/surveys/add_question.ctp:60 +msgid "Cancel" msgstr "" -#: /views/oauth_tokens/view.ctp:4 -msgid "Id" +#: /Users/compass/projects/ipeer/src/views/mixevals/view.ctp:26 +msgid "Reflective Questions for the evaluator are included." msgstr "" -#: /views/oauth_tokens/view.ctp:9 -msgid "User" +#: /Users/compass/projects/ipeer/src/views/mixevals/view.ctp:67 +msgid "Indicates response required." msgstr "" -#: /views/oauth_tokens/view.ctp:14 -#: /views/users/edit_profile.ctp:69;83 -msgid "Key" +#: /Users/compass/projects/ipeer/src/views/oauth_clients/index.ctp:6 +msgid "Add Client" msgstr "" -#: /views/oauth_tokens/view.ctp:19 -#: /views/users/edit_profile.ctp:70;84 -msgid "Secret" +#: /Users/compass/projects/ipeer/src/views/oauth_tokens/index.ctp:5 +msgid "Add Token" msgstr "" -#: /views/oauth_tokens/view.ctp:24 -#: /views/users/edit_profile.ctp:85 -msgid "Expires" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:19 +msgid "Level of Mastery:" msgstr "" -#: /views/oauth_tokens/view.ctp:39 -msgid "Edit Oauth Token" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:22 +msgid "aka LOM, Evaluation Range (Max 10)" msgstr "" -#: /views/oauth_tokens/view.ctp:40 -msgid "Delete Oauth Token" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:27 +msgid "Number of Criteria:" msgstr "" -#: /views/oauth_tokens/view.ctp:40 -msgid "Are you sure you want to delete # %s?" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:30 +msgid "Number of Evaluation Aspects (Max 25)" msgstr "" -#: /views/oauth_tokens/view.ctp:41 -msgid "List Oauth Tokens" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:38 +msgid "Public lets you share this rubric evaluation with other instructors." msgstr "" -#: /views/oauth_tokens/view.ctp:42 -msgid "New Oauth Token" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:43 +msgid "Zero Mark" msgstr "" -#: /views/oauth_tokens/view.ctp:43 -msgid "List Users" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:46 +msgid "No Marks Given for Level of Mastery of 1" msgstr "" -#: /views/oauth_tokens/view.ctp:44 -msgid "New User" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:55 +msgid "View mode determines the rubric layout that will be visible to the students." msgstr "" -#: /views/rubrics/edit.ctp:20 -msgid "Level of Mastery:" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:57 +msgid "\"Criteria\" mode separates the rubric into sections for each criteria. Under each section, all users will be listed for that particular criteria. This mode is useful as it provides easy comparisons between students." msgstr "" -#: /views/rubrics/edit.ctp:23 -msgid "aka LOM, Evaluation Range (Max 10)" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:59 +msgid "\"Student\" mode separates the rubric into sections for each student. Under each section, all criteria will be listed for that particular student. This mode is useful as students can be evaluated one at a time." msgstr "" -#: /views/rubrics/edit.ctp:28 -msgid "Number of Criteria:" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:61 +msgid "Show/Hide Criteria mode example" msgstr "" -#: /views/rubrics/edit.ctp:31 -msgid "Number of Evaluation Aspects (Max 25)" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:62 +msgid "Show/Hide Student mode example" msgstr "" -#: /views/rubrics/edit.ctp:39 -msgid "Public Allows Rubric Sharing Amongst Instructors" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:66 +msgid "Criteria Example

" msgstr "" -#: /views/rubrics/edit.ctp:47 -msgid "No Marks Given for Level of Mastery of 1" +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:73 +msgid "Student Example

" msgstr "" -#: /views/rubrics/edit.ctp:60 +#: /Users/compass/projects/ipeer/src/views/rubrics/edit.ctp:88 msgid "Preview (Update Format)" msgstr "" -#: /views/simple_evaluations/delete.ctp:1 -msgid " to change this message" +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/edit.ctp:31 +msgid "Points Per Member" msgstr "" -#: /views/simple_evaluations/edit.ctp:19 -msgid "Duplicate name found. Please change the name." +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/edit.ctp:48 +msgid "Public lets you share this simple evaluation with other instructors." msgstr "" -#: /views/simple_evaluations/view.ctp:6 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/view.ctp:6 msgid "View Simple Evaluation" msgstr "" -#: /views/simple_evaluations/view.ctp:8 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/view.ctp:8 msgid "Evaluation Name" msgstr "" -#: /views/simple_evaluations/view.ctp:26 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/view.ctp:26 msgid "Close" msgstr "" -#: /views/simple_evaluations/view.ctp:38 +#: /Users/compass/projects/ipeer/src/views/simple_evaluations/view.ctp:38 msgid " Simple Evaluation Preview" msgstr "" -#: /views/survey_groups/edit.ctp:15 +#: /Users/compass/projects/ipeer/src/views/survey_groups/edit.ctp:13 msgid "Edit Survey Group Set" msgstr "" -#: /views/survey_groups/edit.ctp:27 +#: /Users/compass/projects/ipeer/src/views/survey_groups/edit.ctp:24 msgid "match score" msgstr "" -#: /views/survey_groups/edit.ctp:38 +#: /Users/compass/projects/ipeer/src/views/survey_groups/edit.ctp:33 msgid "Show responses for question:" msgstr "" -#: /views/survey_groups/edit.ctp:64 +#: /Users/compass/projects/ipeer/src/views/survey_groups/edit.ctp:61 msgid "Move to ..." msgstr "" -#: /views/survey_groups/edit.ctp:100 -#: /views/survey_groups/maketmgroups.ctp:52 +#: /Users/compass/projects/ipeer/src/views/survey_groups/edit.ctp:97 +#: /Users/compass/projects/ipeer/src/views/survey_groups/maketmgroups.ctp:55 msgid "Save Groups" msgstr "" -#: /views/survey_groups/edit.ctp:101 -msgid "Cancel" +#: /Users/compass/projects/ipeer/src/views/survey_groups/export.ctp:4 +msgid "Give the export file a name." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/survey_groups/export.ctp:5 +msgid "Select the survey group set you would like to export." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/survey_groups/export.ctp:6 +msgid "Please select at least one of the export fields." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/survey_groups/export.ctp:18 +msgid "Export Fields" msgstr "" -#: /views/survey_groups/index.ctp:4 +#: /Users/compass/projects/ipeer/src/views/survey_groups/index.ctp:5 msgid "Add Survey Group Set" msgstr "" -#: /views/survey_groups/makegroups.ctp:8 -msgid "Please Select a Survey to make Groups" +#: /Users/compass/projects/ipeer/src/views/survey_groups/makegroups.ctp:4 +msgid "Please Select a survey event to make groups" msgstr "" -#: /views/survey_groups/makegroups.ctp:9 +#: /Users/compass/projects/ipeer/src/views/survey_groups/makegroups.ctp:5 msgid "Select a survey" msgstr "" -#: /views/survey_groups/makegroups.ctp:19 -msgid " No Surveys found for this course!" +#: /Users/compass/projects/ipeer/src/views/survey_groups/makegroups.ctp:10 +msgid " No survey event found for this course!" msgstr "" -#: /views/survey_groups/makegroups.ctp:20 +#: /Users/compass/projects/ipeer/src/views/survey_groups/makegroups.ctp:11 msgid "Please create a survey first, and have your students complete it." msgstr "" -#: /views/survey_groups/makegroups.ctp:22 +#: /Users/compass/projects/ipeer/src/views/survey_groups/makegroups.ctp:13 msgid "Go Back" msgstr "" -#: /views/survey_groups/maketmgroups.ctp:16 -msgid "Click on any user name to view their answers to this survey.
To adjust weightings and create a new set of teams, just go " +#: /Users/compass/projects/ipeer/src/views/survey_groups/maketmgroups.ctp:13 +msgid "Click on any user name to view their answers to this survey." +msgstr "" + +#: /Users/compass/projects/ipeer/src/views/survey_groups/maketmgroups.ctp:14 +msgid "To adjust weightings and create a new set of teams, just go " msgstr "" -#: /views/survey_groups/maketmgroups.ctp:16 +#: /Users/compass/projects/ipeer/src/views/survey_groups/maketmgroups.ctp:14 msgid "back" msgstr "" -#: /views/survey_groups/maketmgroups.ctp:16 +#: /Users/compass/projects/ipeer/src/views/survey_groups/maketmgroups.ctp:15 msgid "To edit these teams, first save them below." msgstr "" -#: /views/survey_groups/maketmgroups.ctp:16 +#: /Users/compass/projects/ipeer/src/views/survey_groups/maketmgroups.ctp:16 msgid "Note:" msgstr "" -#: /views/survey_groups/maketmgroups.ctp:16 +#: /Users/compass/projects/ipeer/src/views/survey_groups/maketmgroups.ctp:16 msgid "Higher 'Match Score' is better." msgstr "" -#: /views/survey_groups/maketmgroups.ctp:24 +#: /Users/compass/projects/ipeer/src/views/survey_groups/maketmgroups.ctp:26 msgid "Match Score" msgstr "" -#: /views/survey_groups/maketmgroups.ctp:25 +#: /Users/compass/projects/ipeer/src/views/survey_groups/maketmgroups.ctp:27 msgid "Team Members" msgstr "" -#: /views/survey_groups/maketmgroups.ctp:48 +#: /Users/compass/projects/ipeer/src/views/survey_groups/maketmgroups.ctp:51 msgid "Group Set Name: " msgstr "" -#: /views/survey_groups/viewresult.ctp:2 -msgid "Survey Event" -msgstr "" - -#: /views/survey_groups/viewresult.ctp:4 -msgid "View Summary" -msgstr "" - -#: /views/surveys/add_question.ctp:12 -msgid "Load Existing Question" -msgstr "" - -#: /views/surveys/add_question.ctp:13 -msgid "(Select Question to Load Its Details)" -msgstr "" - -#: /views/surveys/add_question.ctp:16 -msgid "Select from the list to load an existing question as your question template." -msgstr "" - -#: /views/surveys/add_question.ctp:19 -msgid "Question" -msgstr "" - -#: /views/surveys/add_question.ctp:20 -msgid "E.g. What grade do you expect to earn in this class?" +#: /Users/compass/projects/ipeer/src/views/surveys/add_question.ctp:7 +msgid "(Select Question to Load)" msgstr "" -#: /views/surveys/add_question.ctp:22 -msgid "Master Question?" +#: /Users/compass/projects/ipeer/src/views/surveys/add_question.ctp:9 +msgid "Load" msgstr "" -#: /views/surveys/add_question.ctp:25 -msgid "Master question can be used as a template of a new question. " +#: /Users/compass/projects/ipeer/src/views/surveys/add_question.ctp:13 +msgid "Load a master question as your template." msgstr "" -#: /views/surveys/add_question.ctp:27 -msgid "Question Type:" +#: /Users/compass/projects/ipeer/src/views/surveys/add_question.ctp:17 +msgid "Whether this question can be used as a template for new questions." msgstr "" -#: /views/surveys/add_question.ctp:29 +#: /Users/compass/projects/ipeer/src/views/surveys/add_question.ctp:22 msgid "Multiple Choice (Single Answer)" msgstr "" -#: /views/surveys/add_question.ctp:30 +#: /Users/compass/projects/ipeer/src/views/surveys/add_question.ctp:23 msgid "Choose Any Of... (Multiple Answers)" msgstr "" -#: /views/surveys/add_question.ctp:31 +#: /Users/compass/projects/ipeer/src/views/surveys/add_question.ctp:24 msgid "Single Line Text Input" msgstr "" -#: /views/surveys/add_question.ctp:35 -msgid "Possible Question Answers" +#: /Users/compass/projects/ipeer/src/views/surveys/add_question.ctp:25 +msgid "Long Answer Text Input" msgstr "" -#: /views/surveys/add_question.ctp:46 -msgid "Add Answer" +#: /Users/compass/projects/ipeer/src/views/surveys/add_question.ctp:59 +msgid "Save Question" msgstr "" -#: /views/surveys/add_question.ctp:50 -msgid " Do not include an option for \"I choose not to answer this question.\" It will be inserted automatically." +#: /Users/compass/projects/ipeer/src/views/surveys/edit.ctp:15 +msgid "(No Template)" msgstr "" -#: /views/surveys/edit.ctp:15 -msgid "(No Template)" +#: /Users/compass/projects/ipeer/src/views/surveys/edit.ctp:24 +msgid "Public lets you share this survey template with other instructors." msgstr "" -#: /views/surveys/edit.ctp:22 +#: /Users/compass/projects/ipeer/src/views/surveys/edit.ctp:28 msgid " Survey" msgstr "" -#: /views/surveys/index.ctp:5 +#: /Users/compass/projects/ipeer/src/views/surveys/index.ctp:5 msgid " Add Survey" msgstr "" -#: /views/surveys/questionssummary.ctp:2 -msgid "Survey Summary" -msgstr "" - -#: /views/surveys/questionssummary.ctp:9 -msgid "Q" -msgstr "" - -#: /views/surveys/questionssummary.ctp:11 -msgid " Edit" -msgstr "" - -#: /views/surveys/questionssummary.ctp:14 -msgid " Delete" -msgstr "" - -#: /views/surveys/questionssummary.ctp:17 -msgid "Are you sure to delete question" +#: /Users/compass/projects/ipeer/src/views/surveys/questionssummary.ctp:35 +msgid "Are you sure you want to delete" msgstr "" -#: /views/surveys/questionssummary.ctp:22 +#: /Users/compass/projects/ipeer/src/views/surveys/questionssummary.ctp:37 msgid "Top" msgstr "" -#: /views/surveys/questionssummary.ctp:25 +#: /Users/compass/projects/ipeer/src/views/surveys/questionssummary.ctp:39 msgid "Up" msgstr "" -#: /views/surveys/questionssummary.ctp:28 +#: /Users/compass/projects/ipeer/src/views/surveys/questionssummary.ctp:41 msgid "Down" msgstr "" -#: /views/surveys/questionssummary.ctp:31 +#: /Users/compass/projects/ipeer/src/views/surveys/questionssummary.ctp:43 msgid "Bottom" msgstr "" -#: /views/surveys/questionssummary.ctp:67 -msgid "Add Questions" +#: /Users/compass/projects/ipeer/src/views/surveys/questionssummary.ctp:51 +msgid "Add Question" msgstr "" -#: /views/surveys/questionssummary.ctp:68 -msgid "Finish" +#: /Users/compass/projects/ipeer/src/views/surveys/questionssummary.ctp:53 +msgid "Done" msgstr "" -#: /views/surveys/view.ctp:4 +#: /Users/compass/projects/ipeer/src/views/surveys/view.ctp:4 msgid "Survey Title" msgstr "" -#: /views/surveys/view.ctp:16 +#: /Users/compass/projects/ipeer/src/views/surveys/view.ctp:16 msgid "Modified" msgstr "" -#: /views/sys_parameters/add.ctp:14 -#: /views/sys_parameters/edit.ctp:21 -msgid "id*:" -msgstr "" - -#: /views/sys_parameters/add.ctp:19 -#: /views/sys_parameters/edit.ctp:26 -msgid "Parameter Code" -msgstr "" - -#: /views/sys_parameters/add.ctp:24 -#: /views/sys_parameters/edit.ctp:31 -msgid "Parameter Value" -msgstr "" - -#: /views/sys_parameters/add.ctp:29 -#: /views/sys_parameters/edit.ctp:36 -msgid "Paramenter Type" -msgstr "" - -#: /views/sys_parameters/add.ctp:31 -#: /views/sys_parameters/edit.ctp:38 -msgid "String" -msgstr "" - -#: /views/sys_parameters/add.ctp:31 -#: /views/sys_parameters/edit.ctp:38 -msgid "Integer" -msgstr "" - -#: /views/sys_parameters/add.ctp:31 -#: /views/sys_parameters/edit.ctp:38 -msgid "Boolean" +#: /Users/compass/projects/ipeer/src/views/sys_parameters/index.ctp:4 +msgid "Add Sys Parameter" msgstr "" -#: /views/sys_parameters/add.ctp:46 -msgid "id of sys_parameters table are manually assigned and grouped by module as follow:" +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:17 +msgid "Change Password" msgstr "" -#: /views/sys_parameters/delete.ctp:1 -msgid " to change this message." +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:19 +msgid "Old Password" msgstr "" -#: /views/sys_parameters/edit.ctp:53 -msgid "id of sys_parameters table are manually assigned and grouped by module as follow" +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:20 +msgid "New Password" msgstr "" -#: /views/sys_parameters/edit.ctp:54 -msgid "system" +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:21 +msgid "Confirm New Password" msgstr "" -#: /views/sys_parameters/edit.ctp:55 -msgid "display" +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:28 +msgid "OAuth Client Credentials" msgstr "" -#: /views/sys_parameters/index.ctp:4 -msgid "Add Sys Parameter" +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:30 +msgid "Add Client Credential" msgstr "" -#: /views/users/delete.ctp:1 -msgid "to change this message." +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:34;49 +msgid "Key" msgstr "" -#: /views/users/edit_profile.ctp:45 -msgid "Change Password" +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:35;50 +msgid "Secret" msgstr "" -#: /views/users/edit_profile.ctp:48 -msgid "Old Password:" +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:39;55 +msgid " Comment: " msgstr "" -#: /views/users/edit_profile.ctp:52 -msgid "New Password:" +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:45 +msgid "OAuth Token Credentials" msgstr "" -#: /views/users/edit_profile.ctp:56 -msgid "Confirm New Password:" +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:46 +msgid "Add Token Credential" msgstr "" -#: /views/users/edit_profile.ctp:63 -msgid "OAuth Client Credentials" +#: /Users/compass/projects/ipeer/src/views/users/edit_profile.ctp:51 +msgid "Expires" msgstr "" -#: /views/users/edit_profile.ctp:65 -msgid "Add Client Credential" +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:4 +msgid "All fields mandatory, except email and password." msgstr "" -#: /views/users/edit_profile.ctp:74;89 -msgid " Comment: " +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:5 +msgid "If email column is missing, students can update their profiles by clicking on their name (near the Logout link)." msgstr "" -#: /views/users/edit_profile.ctp:79 -msgid "OAuth Token Credentials" +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:6 +msgid "If password column is missing, system will generate random password for each student." msgstr "" -#: /views/users/edit_profile.ctp:80 -msgid "Add Token Credential" +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:7 +msgid "If the user already exists, their password will NOT be changed." msgstr "" -#: /views/users/import.ctp:4 -msgid "All fields mandatory, except email and password." +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:8 +msgid "If an external authentication module is enabled (e.g. CWL or Shibboleth), password column can be ignored. Students will use external authentication module to login." msgstr "" -#: /views/users/import.ctp:5 -msgid "If email column is missing, students can update their profiles by clicking on their name (near the Logout link)." +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:9 +msgid "Please make sure to remove the header from the CSV file." msgstr "" -#: /views/users/import.ctp:6 -msgid "If password column is missing, system will generate random password for each student." +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:14 +msgid "Username,First Name,Last Name,Student#,Email(optional),Password(optional)" msgstr "" -#: /views/users/import.ctp:7 -msgid "If the user already exists, their password will NOT be changed." +#: /Users/compass/projects/ipeer/src/views/users/import.ctp:34 +msgid "Remove old students and add new students." msgstr "" -#: /views/users/import.ctp:8 -msgid "If an external authentication module is enabled (e.g. CWL or Shibboleth), password column can be ignored. Students will use external authentication module to login." +#: /Users/compass/projects/ipeer/src/views/users/index.ctp:11 +msgid "Import User" msgstr "" -#: /views/users/import.ctp:9 -msgid "Please make sure to remove header from the CSV file." +#: /Users/compass/projects/ipeer/src/views/users/merge.ctp:4 +msgid "Search for the primary account on the left by name, username, or student number." msgstr "" -#: /views/users/import.ctp:12 -msgid "Formatting:" +#: /Users/compass/projects/ipeer/src/views/users/merge.ctp:5 +msgid "Search for the secondary account on the right by name, username, or student number." msgstr "" -#: /views/users/import.ctp:14 -msgid "Username,First Name,Last Name,Student#,Email(optional),Password(optional)" +#: /Users/compass/projects/ipeer/src/views/users/merge.ctp:6 +msgid "WARNING: The merger of two accounts cannot be undone." msgstr "" -#: /views/users/import.ctp:17 -msgid "Examples:" +#: /Users/compass/projects/ipeer/src/views/users/merge.ctp:8 +msgid "Merge Accounts" msgstr "" -#: /views/users/index.ctp:8 -msgid "Import User" +#: /Users/compass/projects/ipeer/src/views/users/merge.ctp:16 +msgid "Merge" msgstr "" -#: /views/users/user_summary.ctp:2 +#: /Users/compass/projects/ipeer/src/views/users/user_summary.ctp:2 msgid "User(s) failed on creation:" msgstr "" -#: /views/users/user_summary.ctp:6;13 +#: /Users/compass/projects/ipeer/src/views/users/user_summary.ctp:6;13 msgid "User(s) modified successfully:" msgstr "" -#: /views/users/user_summary.ctp:6 +#: /Users/compass/projects/ipeer/src/views/users/user_summary.ctp:6 msgid "User(s) created successfully:" msgstr "" -#: /views/users/user_summary.ctp:13 +#: /Users/compass/projects/ipeer/src/views/users/user_summary.ctp:13 msgid "User(s) updated successfully:" msgstr "" -#: /views/users/user_summary.ctp:22 -msgid "Back to Course" -msgstr "" - -#: /webroot/test.php:88 +#: /Users/compass/projects/ipeer/src/webroot/test.php:91 msgid "Debug setting does not allow access to this url." msgstr "" diff --git a/app/views/accesses/view.ctp b/app/views/accesses/view.ctp index ea385e6e6..9980ce271 100644 --- a/app/views/accesses/view.ctp +++ b/app/views/accesses/view.ctp @@ -3,7 +3,7 @@ echo $form->input('role', array( 'options' => $roles, 'default' => $roleId, - 'label' => _t('Role').':', + 'label' => __('Role', true).':', )); ?>
diff --git a/app/views/rubrics/edit.ctp b/app/views/rubrics/edit.ctp index f0566c453..4be95da4e 100644 --- a/app/views/rubrics/edit.ctp +++ b/app/views/rubrics/edit.ctp @@ -45,6 +45,37 @@ $url = $this->action == 'copy' ? 'add' : $this->action; 'disabled' => $readonly));?>
+Form->input('view_mode', array('id' => 'view_mode', + 'type' => 'radio', + 'options' => array('criteria'=>__('Criteria', true),'student'=>__('Student', true)), + 'label' => __('View Mode', true), + 'separator' => ' ', + 'disabled' => $readonly));?> +
+ +

+ +

+ +

+ ( ) + ( ) +
+ +
+ +
+
0Pu6uy0)`@GM4y>~qKe(&?W|9oSd4SNj6V9&kQoNLYYn{(}* zA3GC}BgO_s29RC5c0q1~Kaiaf$W_ShUAzAL{m*O9-aUU_`?$FF?A^a_|NcL3Zk_`? z+}ym}`}gx6;^jSX5WM#D9OgT8@bI61|M`+X$^WDRe-Co+=l=7F|Fdi76NI08*9oru zdv=|G?B?IKhkw^j3j_**?Ai;?_Rk6b=e2A19?)cK%*FP{g^kbMrp-xUs&&>Xu zo2Rd?t#2?kfvxR7`Pv29^EbBsi?e^=iy!1`H@F5|`~T!?*X}^@-owwe_qgglfy);A z@AwLyIQN)a=t{!dkBvMs=PhZ%cOUlfikwuV$kP90?LRpCf5+I9{}E^Z#n}Jmiv&5i zXBW75d-x$R2y;K9atD&AUMMxZb=2rIN2Y=my$JhebP|&>G$X%+Y;UZ;B)sdHQrYod zVUmHl7lXZDOnp1h$qpA8>E)M7rZY8}ORRYXY8|#{j0Ci8$y8Ux?uk+Od`a@~a4~j? zxw6Hs-GLChIO@P*Sd@olt5wbfdsuz*{Am7@7jJSyyG`HKbuuwb4%TM}va*Jag^p~J z*O-Aj5NtXNk;F!3??Cj(Q78sb?@Y%t$@lj^w&+gE=- z+Aq8X#;Q!-b zXx;`!XYw%@SPQc&fC8|8Vh8d#@U-s^geRBy1s2WT$BbWV4Tk-$9#V@t`XeV*Q{cE? zvIo!prz7gKP?~jL{8P@}tx9aG8!`pfq}Par=g~A=Bz>g)@0NHt(%>^eRV3xt)%G(f zPYkR{H@ZLUyL;}Bm^~GbI&^}AvnWD0k69y5S--mxfrKf(|D*kjt4kewZp34Du6;`T)a?2yQ5A*=?V^QPeG`YDCS*|}z2)6EVQfFv z38LA;Q(?MzvrAip4EFQVdu#)2o!>5*K$qYcdS7MJcOY+~T5wZeXE_GKJCJr2_USCg ztANG&Wql#rmtH~^`jGz{w+!?JTamu!3Oj$%YX@>$*Sy^ZUXkAtxdZVS+uv66+F^f~ z5=O=uA?kc0ooQndBBd9)+au3NX;|#60N2UAvXK)UazcW$DwB)z8BS|~mhV7V$B48) zb|6jWI}pJVb310>553kM2sHKK=oSY4N`7=rV|i@N<$_pi$VCIK6wyq7LF8DO*-&|{ zt#2Z}7FYMJ?&3stLk*d5CZ*ONQ9vaU%vr)%JN6UT4|*~*=rf<?0Qf<_3Fo{Meg*og0zUqtx77-`iJ zOvuh_FG7d zF&E%0NaIO0BV_5*W9ah^yzTGK(Ai;dv(>MO<*yvvTve|F{9iv7+(+-)fjo%;N+&6z zjXMwsOCE5eX2oE%8UVzdNhc51&B;h_xJg;&e&&Umfs>VT%Z#9G)z}ZmWS>^YY6`D| z%gZ%IH%MR_qwmw5pVPe;b$IBtrfEuu#x>yXfh_qOp}J=h8QLrAuDf>cTMby!ekqt( zT-Wv#qR6M)DW7mv6g^fJ2+$E{N^#l&1zbXRzn8WQPJ+Tbz1-?Ocy&uT4fS_ce6!L!=44{3$?VTs0Oa@)XYJVCRzY4!ucs)JI$&89}e zvDNHXXtIKS@{gtXuTdfacHJZKqx67mY(3(#jbR>HAw(B7-Z7ve8Pk+_2e*x&yGV zJ3Xa!utMGVY1 z%G$!ikG${la?Pp9O!##RWA>Sx*)DGfqSCsSBOjnR${<&Ur_v%EX|QJ%omm144)GBc z*&cLx(*bXYX`&UJf38BCUGKKJpNO? zIpqZ(9p$Mf3K&w`=^7E)4uEpI8Pfx`{4Sth*~L$NU@i{j!Ze$*1n~ql<)!*S9aV7q zJgvji;H~7{h%6C*T{s2XqVy0cgu?0*Xl#6D_C$t_$qs}NUF8p19NK$-BrHYej*#z~ z&vTtLeul3{k-kx`c16zX*T_ftvZ2swR7uFRwe7>rfSH;l#$c_c@G^l>Jcc`2V!{Xl z6=W1;OFcx0Pi@z7dxq8xoKV@HCE2|L;SP-V((y&;Wr@p^PMmjmraIPqCR*@X2mbjX z$+%~#Yg25zo*EjA`JO!Hw3BIxEEs)%BaR0}sWZV!r;ElUSwy#_WE%%54RT1rF(-SL zqV7l(7iPKNx{%-``g7$FrxnKEa2yS#&py$+i1taP#)VBH4?z!wW|`2!Qo{$o>X=Fn z>xaQd=jU!vtX#3*6sIZlW!ZRpOdNP3!3;-3U>#u!A4K5xyBz{Msv z3CNZ)&!^OQg*hgj=6`?e+OS+YQxDsClVwgfrv^3_K}FC`*{i0pwwfL%2melqIK!WSuvCRng5bBLmmh za&{nYAUbpl)3pQ9Rb`TwXMv(qQO}LiVSo`|3q}F^yz+Jc>#_p)kcXdI0Z32|qO22Sl0$e#C_9_M zM+m~+s}Em5CeIjVaBN0bj*h*Syxqxk$9z^~+Ou?elqz;0LY~rl>G@AK?C?7fUR36n zUd8H1rUq)LL4zmov2MYWaX7&vQjTJh;_U}wo7tA(P=2}IB6(TdrvYWB5GQl}!hzfX z+_SkZs;s4Uh_>QVcMyx=Tf3BRBJIjl#Wq@&z&y;u;UX()D~C~jmh^}w^>bq$nPT+u zS0(P-b>~jvymcFje>;2fA@{v8M%eRrKSokz_J3X?PBf&5!1jXH_UR3pX1KakAVnlA zdx6i5q7rG7d9v3(#PkYP(XZU%3FPDGWyP9~1FZu>MP(O!m!P7s+bU2@AFNEi1sYBk z(o-iq$HT>(M#kny$*E6^*V)>aM0#6w&PGeEs`ne%Jx*5kfquPN;U(6cjQ$N=#FGoq zqdI%(=bBrfVgi%4Kr%&1zA0Wk|4E6L+StBB+BY@-kWGFqC^zCC?WHJ`So`F_tC#%Z z+eg(CYL=*8Z>IO&o7dKVSY5G*!v?7h3=Ja7IJD$r{+l{sd`|x`=d`&QczHDvi zncgL1&h*3l5QU2oCnB5`fv$-II}m=vgGDpz$8RbO$gUuZX%@j(& zHl9Ageo3ULk4&Q;s_=oKn+ZGq^~mVL>Hr!5pRsvaGNbhRqpf z-JfhU1gqna;$&y2iedi?4Wp>}s-D1oU;h^0O6uSAMJdNB&#-~2z zXn3Zba6(_E8N}*E=Q~RVVQxLUYxvu}j-%(#cxS!1)!C?Ryd@1PBv-bRAw`auI|qtZ z{m_B72&!`~-LNTBp{)1BIl#rD=DwnY~<+r4e8-Ax#kGP=gA;?SC_!p|yeVlY-Avaa6a!PmYodC#lbVDG~K#rp0g z)xb&QK?f9^@)gRjqf1exj-Bhg24uKWL&Z6ekI&y`ZhzSq;xUn?AKUlY-(}5U_4py@ z1ggppcq>dAw0STwl<1^kYjn4i6Oh6=z&>x;Q>TrfOwo!{RwOIC+>UtUxEW0fh-7*M zK6rELvo7BvovDYmrzMx-_qXC=v#GhIxw-nej-+9fR$udnOIL)`=C4Y0ok{9Uczr!V zrK|FI0wJZYjOgMx-0H{93Jw5VXw1Tutn^oAUj}c4eEyj;U(nczSa?TlE!n_VV$RvAyXZ5f2`R`!QQ5V`7n11V6Eh1oWZ??#em&AGh& zJv{H6Gh2`xcWD~GAr@H+hmk4Mb zxVSzdrG-@UD7{-H9k9B8g*;>FIDPvH&Jc%fJVgW}6W0|Ij6z_^H`ub&L}UD+B3RJz z-*sc|S-Ss&o%MxjxNXo~&SukRv13PP`wE_Sg-|*BR@nw!m)+HC?9K;jAvH9 zD89_~mPgpP$<^w8Z-%Rckzz+pYHbX(SxWZ)^rLETTD3ehgtxqOMc7|aw**lXNMg$d zWR@6wX&=fwPH%{%h(7oChX2-gaN=dySnrj4ZRZKTVr_=z7VwMMMw_noSiOTN70NSB zO_2by7|S;o(6&w##E<;;M~7eNQLiTruK0?N0*8H1x2ta)LhWY>Atnr;W6raVepiR> znWKA-YXJyqmttF*NS5pu$3w=B7uz#DWdp3Ps+W%%h<*G1Ehk|!qI25snQDcsJi<(Q z#dSpqp13d->|gD~W02;FF1IC;e9@JCW95}44YTr-xDha^7u|tWXvXM4SyF&Z2;Gb? zjM__X4SqeYfd6heKJR<*x!b++>;naZ<2MzNC>d${n{qQZFeoG(lr+K__8LeL^y)j>%0n4F+#_1VX~qYs-Ri4tQTAL^h4|qSAwqXUYo1$Q5oZ zfdZoYffW*OAn;f&a|a?-cm5s9Kh2ci&0BJ=?dohsxk33Wba#!&v8svJ6Cp>nhW+LD zD>^3op?z+R_K)Hi-Z@(r{ilKYNnUhE?UKLGXrTq-8;dAvGETAsH#B-F3CgZ`9&PB&e>dLufzSzvSf{E! z(u=Oi63lPM2mq7R_@gW+Fd0ItQHlIx7~5o@-$gMo^;h;;vgEd5bmS-K7cU`so@wPSoEts7zG!HWur(UXwj% zRQJs8L2ciKhX%kcgPRAKCJ(>xXrK104ly=!WIp%MJnX0`b+Z5Ehu8BjD3(KI(@WXW zww1Li81ndZ-;0$U$i!Q$B$yq5LBJCq))o3-M4o#vGHxBo(;cD%C#~u>#A*(AzmlyZ z-|y$nZwp8T_K z>xz@|+HWSmC$?Fhv`{dSEUGwrd)Q@mV)pl`7pjs(Db9FNim}GR=Ug{MCaYw1+@?}J zv^?zM)khgCK6SP0^-1`OnQ3CpR4`%DpXt@g{0()p%>syT7KI(I^P_cJcq_I^OIG(E z?>9)$Of1iC_v7o(Q8}>BmN)-+TMr>C9m9of#IR1&YpI*hyab!ag+I{D4QAHd+jzgWjkDIo3A2MusRRaQc{3G3T1hH&L_4e?Jp3fuU^Hu!6>hW#U8QLs;0C%>iITd@ zhZz0iqEP#IFs8%~iID^jsBg%-XaJvb;L&Iy|IEH|OwLPqGy!H`}lgS$qxq zG~@BGry}A$1@E0YCnZAV23HT%iq`z7oe0|7W|442#(*M~X=m1g-ho77Y1dyh9B2JD z#8EJ(%h@$(n^KER1Dl=Ci7OsOE9H}xzAr{&!fwxs4D6k)FF&MA zDxY{X*ZlpH?VhKE^4MHOsP?EGfp+}}H40ouaa`QL3 z5#i2Jz9TOx;-21ZuW@y{$>HvBrSL^^_6#(Lp|7NV3dTNV@rnK}8#mi5qBWDv;CeL` zwCGc6Fd|WHgLsi*E@$Qva%NXdxHox9C4on8;G~wWO|wUWuRArp7Cqw{1g84f;&B%?d4=c3dAJeEki)$L!J&`S$W2W0F7$0_DNvxz zHbcv|2ba;OQW@fvS;fw}1Fd1L3Dq`Dgcl-K8FtSXesJC0_BG_gh1Yqp zhKmljdgE9_Mz+yq#M+L<6vAfujA=!$&%1)fX=7X8TGG&isRB_<-6~RFxbuF+Onn3G z$sJ$b>qP(lv)kgKCrVo(kM`_NX*lvTc4@^21maITi8}RW_y2|a5HSL_strOND_Lx= zp*^5Sa{{|+u1@@R$`5qaxs|&%n1?n3$%nC10exWa3T&IFbPtEO;SvCwaB6wK19{d< zmJJ3&i`Y$&wxkO)OL1eyn$tN6I+8;`^!GKz`@@LZZ~U=uOddSA2yLqV41v<75-*#0 zRNsx@FGz5azGdIkRMloAHnk2m=&0E)8b$?WE%`tIC5%S0xzbm#;v$I7S03J;&2kPp z#@F|S)xs_zPQ`jg1YisVjIohRuoFzawL~LmzJFsB5PRn%xDyU6>gd1k4pJM6KJzV* z%b)kGZ=2P&6_l2%hT8)AVJjd$K}8gS>uH50W7*vO_*KQQ)ih##!4+l8frh1J|6*&a z;v8`3UnszMJM45Ww!7`^4kQ#b8-h+@LOYNF$#l+RDy(FX;}ZXm4;Zpen<{cJ>U_*4 z7?8GjDw}Q5LHsFwe4~c^Cu9Hi?byPLn(RF-dIZO`8?#k@C-!B(T#s~n~|M=t*FY1MyN7;a}LVZZBK zUGOKq1o38yu?KvO{vJyP_gG8MKhW0lo&p!)A#!_vWT+2eO%nTyz+k`74&Bj*&c~VV zKrYew{*v~8tkhr9{%ddlWl8?S3jJkC{<7PDc}YmiUtaRBnB@OF0=(#bo)Q`n;eS-+ zcp5!7tnK@9u9?}zrg#S$98efv0j!+4Mq#Jck|BHU8DpfdtvBru23iXE)P+2Y8$;9XWT&7pH z_?7QjTW9=!2ZyFGGPXq~dm#8ogi zTH6bP7gkWFIvVW0-~yBT#1f_zcK9w>pzG5}a^`qA3hLaKNhwY}DMScfFw-EL$8D~z zRd<`I#-6H0Dq;k%Oe8hb?H^wKPm|p0n=mKUGGYKW-OriM_n4(Q89m0=j1_dFCAlwv z{T&s~LY(&UdXd1gF(dWQgJGMgv$x*HoOG-UTfJx6B{!9YUukvs!eI_&xCOSs0msu6 ziBKf-+?XT~aG71gEgCEK5BBPQ~IrCx_PR7fXOTPmnG+K zt;R3jcKOpPE9a|6Olmiw-#P>08;HLw)_oLm@*w71sQ#mPp}azp{^Z;cwcB#7EBOn= znJ3`m@QH9six15YKF<(gI{TTnn4T;sMronpI1Lug@(q25LQuUp0^X9?CMD6Z!|`sx zXI5Nm5)lc-(JN<6ABG=G@L3hQdcwy;m%!lx%f!cVBneLEK2Ry&omtR&L4Q&3#b2@Z z{hGZ|CH_f8s;T@Y?pVPE17igkGI=g4Df(q zDIz5p`M53Nj$C|!gZn1m!RMi8{=n0#s#m9O({42-tVC=g@vQMwMhMLe_h*637w9fE znZ$~8ctD@96#dxox((?JwUhx zqOj7q`z)X`k&Y7{+j4dhtN2*pIO6I1;?_!Qa?9%DiVT{ZYLe9>-G?KSSe7vE6YMC9 zBKIs6BTF+3U$*>NU&j!4eHvOeZH0c*@MhCumMa;5-V22<-KiNtr>gpqw%Jb; zO+tf;vkX!-;!|%G4a8ooIt3qpW}BWElLmG_-CY^bboCE~T?e!L|K4m6wHuCbM#26x z%_VDE_+&FFtCc8#J_8JdmJH7k8Z`RQ>aN*i`g@aGr}5ujR`N){f1d7L#Q4cU$&OwQ zExE}$4ouSJ)~?fuPa70b%t`2DjyfnQi9*DYpMehY5%CeSM6-~65-rrT!?8y%npGC+49+C4&zL$4)dj&dGUxH%qA=h5ZkPllZ+k9gFv^3K zS6tQ=|K8mGlbv3Zr?j`hBC%y;mcR~#;q;L<6v^_NJmfbi4j`}MlNL#QBk1$qa*00o zBFxq%@%SKK$Cp&^D@KuSdt+LHkORQ%Wc!jfZDhhH!ximQCr?#EP}`Cz$U_J{jgLLJ z4Jku|27Nxcx86CwdF%Yh^GL>g`!0I@&Zto8{kaxbVBUY);6geH9kuGwv36=qMQ&r= z+ez`I0bbtJ>V^06+ERtLeBch`_u8NzY_MqatG%qIkz2IFHe=6F)3#UL(=k&)uU@cX zg1Cl0Icu`BSs)V2wFW$X-$=J@Pm6Eq<|VVVY6sQ44JP%=`exIe`o!&hyoHsH#|An% zcKh7D;+Ssa8}pj&%G~3C8tgZ%$qDZ2h#a(N-vYdwCqwKi-#(t2SorUx zj{&1cZt#C+VpsE7A_$I!8@-*=3fl6t!4;MejPYWKcyHwg&Ym70wwPT{7wE{FbHJu0 z)CKf8k2T&eFY7pI@gcsO{9HDc=Z4sT(VZ#F6piB3HU9UeFRsc45^KGY1E1%8pLov6 z-XB>^#%*O8{-eA42h9vYWl`IgOlk2Hz8128X+HXrH{YilbIuCAGxS_s*z6DAX{_&k&}UNV9-RyNj!|;h@0okWiCP4F@BdGmp@E*=eNf zDjQvvh`{Q8v1#{BL+`yCiG^zPEAXzv%@V0)7j&BZrgGuwRu$ za~dv;46R`5ipB%x@Z%BVnP-7dS$sO0{>2NNQ%-!>%XXC_@rO(n2L~rU+;BF$U6gX{ zVelV{*HN`rcM=N7VEw@a^!^xEPJa!#ZIJz34>m{SuZWk%HVI27ut$CGZcC&$jbDgV6|)6A}F&|JtWA6l#~1Z!ni&7FcuE4t*`LI4MZ z<7p&rX)&zjeQ|EDN<~mupz_ko&)*Q@-`lPx9x0tZ-I@Hb17D$pD=uF7QD}C)praFM z6_Wb5_-5lj!lF`JO5oB}3OVk`yd_G7Di=*%?71&~74NK$Q217faX?cf^yl0~x6k%W-Z(QY+$_dKb^!Rz!#nQzDNh zW#l=nzRp;^I8*wdrJ3i9RZ(UAxZ_2{*Lk@Oqn~qlHy?Isdc4k^&QijNi2)yd7Ct=? zs{8M@_m&bsNf(ff)DesdN;gl0I#td#g-{{8GN_M&8yV4{ofP=5)kw zd#fJ6AJ#S>z7h&!9Ap2%vZrmD3^kk}Er4cyn4F54e=eJb zv|E-Ls5i3`73NkHlN)ZwQX)8uh+8@9V$j%!jJ>$w`y zlUr}Ed?&Kl^J-JR=T^JAIaMXPl;{DEgq9uT90AS$UB^R?ZPF*oYx-9zbj6z;Du@-m z{`$#2O0K<$rDenWJ$2XD4vnd8+Mgotoq^yy6|;NtfqQ7s8vuy`gqQ^`QYV zu&(jn=SFZjR4wPG?gX4EQ?tU!R4bfaE9}mt z!7*i|EO&KYa(3qqBlK+b3*Q!(x&pGS zUY}vR^o({`7B{%jVlksS)VVK$`ql`r%h@=Q@$DXn#lS zMH$y1p*NvFTH@RG&CG}Hp%SB5NO}aLs|v8DtVqq152?Wq16m`kn!$0=`E#2Nc}2Pd zV_g*w!ij|H$4XR@uiceU)y(Vk6MK(u&4>D&dnO!Mn1pm6peg--eYpbP8avMAf{|O zmA}efu(T$ty-q2~N%W2KUblSMJLgXALw}C!H+z^zaTAs(QRz}_uDc7vbmtOwbpH=Tl+N^-iJoP;APJJRGpk)L{qa#FcX?>9fh+-%0bUoo>GG z?YnfRN_amXJS%j%(kk>TN(DT0K!-1`++ljL?6cZ9s`TFhf9lv>s>&g!kvR{SLfz8G zc^wBne;<}@s(F`l$xuP=bK^a?GfSOjaT-=*=02Rmu5R*yUEHf=SCvpFxFKR#JH0*e zVay$gHMP_(BXZwZFnj3ZHkd5@f&lz;n!Z6pOk$VhT_@_@TE&;L;*@n{Luq|C=v>?6 z=h?K^4?G-3ADkS_H;Oi@O0z9XaK3A~{@eWVr<*yi_S80EMKHQ7C3ZSSkoAb(-l~Wd za(CclznynJN8@BrqP3;84SW0#z{@{>Z)mSUmXF?YywxFNTy1y1sgVEZzy$q^Pu8Gy zUlcI4a{8jIlt}y-Ryet&^nLS4ukXzmpR}Z5@1t#|TP!0*r)m$Eb-usfQiHQC@ki!G z^wjF2Bo;p3bxOC8bG2AKJ+TL_!fDMCt+QrcngcyMwi3WgzwP~#_!|8?lMD1D}BAMJ*}rpJ!}sy2rp+9gyxM~#(k#TGf*(DDSIu=`$v#) z{y(sam^KGaT9HA3>IoWU#3=Ww8%+0%GgC*5?+tQ$2J=8h4U)^Vnuzh64Y1Uk6+i+t zRMfnlCf0jK(BQ*|0so`LmfA*^{Gp605%1;{!Pc2cH*Avz zExq+ULKip7oE%PHVDfoQmU(ZV9AU-dW!Uf0+A6IPGy&GN9>;dokx)EKOZ{hD@rT<` zHPTk5`)@}Az1wBd=6}VY&@NySIt+vq0U?Yi_Is6;I)5sT-+(9}-BG+D5vqPXxh*#5 zI^p1V2Yr>7@0*UiZE`nL8zi1weY$8)AK%b<6iZ$y)7xFkrezk=nPgCD^Nj{}XkXx(l`z+>7n4v0>YpJMmdsZya) z81;U%zjx7sR(#~65hQQ^bJO}n$7Fn^r9kTt)i+rPrnL_PnNXd?b_zAKII zlS4ScjaJ?+4I9ug%0+0Ug*D28WIVP%hve#-r*IK7HgZ%+`Tiz$L>b%HgZgus9e)v70qmnc<~xe8EAXXfszfgg9f&hECZ?^S>UO zM2t*@+Wxy8ycYjI!AvGH<$;gPn`jx}DqXWB$%A}E;wnu@%QmW_y3PYZ3EEh~aLf6X zc<9+gt{|uIIi9r7GI73&HL0#6g!n@Ty*)8Q3z9|YspILkm?h5iNpi|iFpu$JRZmTC z=MJX@!uWD(UZq3UTi7q5d%4aX`eQw5l+S|w5bH*bbi%zox5%F2slz2Djkn*_#WmWV zxiqzL%(f9*fny1ox2NrkrWdtyAem%Kn#$ATwAp7mYQ+1Mi3iwzR%v6){`-O)bbCfF zhu$lU)wz+ncJ)Ks^c2?92|0B@-l$i(4psz=)v47irg{fQ2YGe8 zH6CmmyK;$M-j?W-a>M?UQ@zz$yRC;>_^q41HV@IH)mqts_utNKjfA|Dbx2j3z|C!9 z0-ZmGo*~b@p$EKgmbnQ+;h$2$!U_CuIy(Qi@{zLy(-(~#g1O;_{jBNG@bJup-2Atqe4X{djzIcTm4;Y>{bytQ(^w$i(^j zT4zJgkQ2i;Sn5W;=oeB?MU6+mJEBPFOldDF51x&B`dkJcKY=CrF(QFvrY`E+(Djc%L{KqW z4aoJSkdK%nk(BJo@;B{wgqMH5ZT{IiUYvTi#YX)&H?Z~61o)#qxFWJiS#Wei?Hz-6e zH*Usi{KU7e&NR!YsGC!@#6YBOfZA++O}x)Y?Hr)Fim_!2{yPo;f&tyIZ3hCjSQ2bo z%(;J{O`cN7Pa2@Z?pn`k{8J+q@rR7(sf=$nDI-hgi`xEBY$u-3Oh`ZKf64ko1BCMf zD%fy#0nVj&w7Z~$*y1g3IWP$jLZqHSqC-VRdW8+*@44Kl&TPAODhmDT-sul9F)~-B zWS55qJMdkK@2jf)0z70((#I78Oo~hmGulln9Y?Nj*Qchr{d9gxmAZo5yU<&|F=@g# z%p#muz1R821HU%Jud#YW1a|5g9m=l7{%pR*7K_ss_yE`xnm8bf!0IdhKtA`Hxf$`@ zzbU}txC0$IY3Cja~# z4aPf*Za*>|PmBKmAL`+N=Pnbjn(RPIMRp(^h*>D0u)<1&?!I$13oupsz=!*REZUA% z^zO?euYTHcs3pFdIii4nq0n>Qz;^S2%S_ThI?S0Qn?p?Y?iz2yKL13$#}}G zDF`3%(C8TM{Y5_T(=(fzjY~H#c%bvfvEj!nGO|Z^ARFDZD7H54D~vR{i{`-cR>*XG zImwaRGIJ{5=+*;Y3C&NQr8daedFi`x-h&;Zo9BsXkO*@dsY4kOO(K6W`41?+L|OWY?Kp3}iIVvX2E z;r*PhTkMeP*5C?1-o#vakzNOF5BFM+-Z_|6T(CvV+^G&HZ1WBzT_=ypI0In)=$^A} zgM$t7J^mw1z~5w}N5`>fP8?I9}$&NJIj(9ljqVK0>cF)Q>^b4fKke#dt?PQwD zw`tG@3V~-hvCOs9nzNN~akwldj{gysOKNE=@E>>U)oO+2af< z2;PUPZ`KboSsCC*213nGH?X7iprb5@YC0Z|d%o@zz~M+)vLBg?%x@cH6*}pEI5T9U zK~N=)R@?R5>Joecp81;!7EQ=B6T9(}#uCDR?zMMg|L%(Y=Znl;uY;f+r7|s?aG+oC3GKH znMcuVV!_k07ddM4LnO0TA%#Dk_Y66j)@Kf!tm^w(DUcH`#;qjwXv@(UEvZ*kx&s5Ybdf7o+SlssoV*s?rKR0xrS_0Y=-BEhS%|*vNeCKUz@+0KF@BNzi zMIcmpF46wDst-?uLWFE!jLR_rMH$KtWYLc{Lb?BV;*iQ^T8lU)i`LLfZErq%py;`v zSvVD@;IBQU=le)r&U^Oc>#3w$F=Sd1jN-xR&Y~rQ3Tw(~2gAWL&~Uybz71^E z4&>%EcxVMI>H4K@))d=Tys3X7t85!89c^T$g(w`f4RHA4IYQ_%7?2S!GkKN6@iqia zKs;x6txU7d9x$gH0nXF9Z_#G5b5O=J+PHn)ez1txZ?*5onhh8?)A zQew|vuYTI9wUif2mB0!O>(x`2;11Pe z5-9TJb`A;qvl3@3(_$7BemDtmvD9$(F1I?SyMWu)odz@v8bgjAKCPI{*Ri@p(s2 zjZ!lgoLkDBcR)t5yi0(TFChW*@1(9Qqb7Ai*R7Gk8#Rh;;U|huP{h=-On!RxdTaI} z7p8(Xn^cCQ!E@Y;>LyMnkVof5NG+$m{X`?{T#8Z8x!fhWVmw7}MqWPL_$(w4U0aU# zO{NhU(trgG$v|X*ekP($Fqg#AsEwOZj6EEXvMLc)6%d4OdzER}soHp7_QBf+!k0EY z74oBTdOksfF2wu>ehI^hCzJAwC3wdbNHKRKwhbno?amZTp}buIp>)m1bMw{yNG z`($2J!d}Xp>j=U*%34*uP|q{bd!-0j#ugoY!XG0wQ5+Q5g!?f>*=+2Lb)GfqQxEAf zy!AocdM39Nh_D#K%aw_>zH=g*tImdZ#6^(76?hnA&v&6MPN zWJ;#M_PMW`zMUukKa-peql+rgp$g+`fS{_(sf(7W&Yx2 z+D8|fLKcrBSjOb-v#+M}g~y}@3P>q$Pv-{Z?ah(hRO{6k);y(s9rDiG4Yb6>a6P^6 zK988-8Tl~~vXo0|J2BtxKmf$AE=P9M$#JJ}XQ2^ykwjUg634WF-MaO)6H|9Lg zhm@*I>h$&S7y5SZdiJ?}56i9}EETuBH3FLCJMeJv_GUgl;Mz}3MzC9$KaaY%!mRla zUgD6$HwIkuTa9>(U@j#SsfX0Cd0E$h*a{LC z{=S7IoxGw++W;UdNrKW89hF%jn|U-vukaIt;4q*Zr0ofGR{S2deQb=d3ZTNG-bC$u z-_6iP#nVFcX`1mYTgpDSaSYOyLJYUt5}j*$C$n1}KR5=_9zFNzm+Ek+I&9v-S3+5|#6f^#K~DN9Bw0iJKR6hd6}+KEN-DLtjhF^x~K zkCSHMZUtjw5Sf~4?#Bw3byj~R*-NiWcD|Jzl;kB_{Nd=82XZ0|d!PbU&$pY8-Vp*Q zU-gyyk5w_3hO$k}lw|~ypwdZeWUEUhqwwH<9!5V?jKMcUZq-$8tKXE6tD$Se7xw0j zdxvqx)u8zt^YbdDE3fw#lCC?6&cwe&uE#A}>p+;iEM0n2TC^}5bQ8z5s8ck74Ae=Wb&e^oL=@WjYot*5_wAX=SU*)X`%)Zo0f7Sa1b za<*p_Pb2@v&Hh>^$Kt<)v_KP_`DuDFGaz1k%!=NbrQr0wr~CQEqzMb(5buTu>GtVX zir>F$H*UYaZSDwkRUp0g-!=-+cUrYsUDhWQ$9+-qq1s)cytw*EUbKR`asz(pY=-{nJHXRmU6c4Y^UReCB~ z{WYv(;8CVux-ifU_bBlUV}JVSeWyifNCD*iIqP^j=fzh8s_({f0hGR2BHF-W^wNgh zhIZ+4NCX^>TV-RuUd#_yq%!Q4>!j0iRuF5gph)O(z&QmIJ;^nS(NWgO%t1;v@H4!L z*9X@y(nB8g@hjjUkB5meEw{1$=Z{{y_O?zu3JA|!EPciU<|Cr1n_yVeR{xWr?z4A& zRqY3Zz`RQiPAhg_t23#7GuW@|{gZ~SSBz^qdTX9gQEEtYKnklIZM)YWr{h$B5HR3U z%yt@9qEgQd<-J{r@4<33mp8pte#e!1>DaaJ4A6I!Jj0kmvf6&#z=)@4E61S^x?yRR zOWA@#`RVhJVd1IWFxZ3_M6tlsUaa@6*ETKBefGuo-(Ie8=%Jg4uU+Lvnip%jMkXsB zk3sC6YMU6?3xYKvszskp7kRmt`_aQ3NZ8e~td6k&HjqklD=Fa46M+CHjTYLv7z7vE z4GB3_TOM@smC<>(*Qe>Tazs(<3y;sGJ$%eo1adwUFEW768K=%C$T0D}%~(DByj8;m zGOV~seUKaP5*u1Z$@I;dQ@^#o`WGtDT}@8%?Ookkg-}!M>Xgf(IYuK(Tfp2TaLHJ` z%B-N=6*qetle7}OGPPAnfMyc$lSF(l*{Ta^z!XLt0y;@gQRsT*zLa?LRq+M&tDDPs zk);h!(}1HxCt6HkxeuDo@*C(G@fW>D(fmrcL6sp-12J*w^YP_@By*xY{VJTAfvD-; z91IHa1jw|<1u?ibwF1FgDmpT>xQ$2h0}DlaB$Tsr2n-TZRYSYk0GGQ*!{=BIV9r!nIZ$65KGkiplYjn@@^=8;QpI z7g-w%y$5)!zVZ1uuq!O_c{ZS;-Ko;QFJVAqO=lT(YAh)o#SKCqv=p500Mpa%08-~PiPv+Nd;0G%pqJ}WZC z+01tW0cr`JBix{+ror=m-RiMVJ?&yg2#_#6Stq@2EZZbSNn<63khlAR1giY+1nTbJ z2^5n(_J?Dk26MwY^RN0QlZ5pkxmqSxtV8F)Y4ghoo$9+FZRC~xCwk(n({w?x#7F=+ zzwg=YThw3DQFw#S*9sm3d8T`0xod?sX+%2PpB+14aNH%O9LxdmpnPm0)-52lPHPDU zDl#R#vByPdcY6lbHtvQ%Kfdp^m*o5kN5k#a$DDiZ$~$cDEpPcg#DxB2UTy7~-(;3y z-v_5v0M~rZhOc>KvGo2f)mZY3nHhMD7H3p>;F>tn0Afw&EvhnEE8-3uJNc{cu8uNP z(KeK$mU2K8b#OnH4Pq%UqL9YZ-B5vr|6Egq^d02 zZg|!Qe>(qgr*<6DKAcupwc4I|45pL&b)^ z%w}nh>WQ$M$$aedEE9rXc_ZkfcL>n#lY}U=%7Vm2rZ2R>J*7|05(A`98h*KnS3MA^ z(4hcu{NDlSIDv+aTMhC(s2gyb@jcgm9G1W8mm^m5_ICTP`&!j9Ha6#TkL{jIetl(q zo+YdY5@%F>n*^J#Md@83u*DeQZ(o^Wmnn6-y|xl;Dn zv}x68d+nLR-uy~32B|?;Zp9yTcJ{2#j%I5a({kEeKM$Xsq$u;1_YEuf&Zc(o_;d4A zxVP|pH@p`%&}=*{d?B;WH`lz=V7&knx7+8-x4Ltl0@?Suyj%^97I ziQM%zhDJakK+(b^2TQc4kIS0|t|USIV@*4ieyl@zQ7zdgSlZJTBA$Z_>1i(&k)aRO znow~5<-Nq0%0cp%D@uI`wnM#FBave!?G-{|wr&UB$HZCfN8-*bXY&On@{l2j`aNO` zfm*z%71}y`URy+P-#c<8DN-u)Ua88PsB?S!f;xWZaUOSVhe{W*q@gd) zeYy>7EpU@3Gb`jHs*BA{+uC`y+E#!q_6G6gH)Y(!jj;5KmawUq;IgzM^L1Iq7bYt1 zh4wIy9;9-(^fx|WUi2mdCZ&l-kY@C(o%FT!KTJ5 zLc3u-6?-v{v92XfV_zcAhl|7m4~3UeaQfV^!WQ791WW&ULTjCgUmoT{@apRL=vo5~%jY3nHkv(;pLG4dQj|q9teIjg zJ;t@ir4x%UaBmqc zKCSgQ*?1L`yR~Yangt0Bi|Ag}QJ(6c3egIu=Sm;YVBdvN>X#W@w{^}7+MrGl)~cIi zK1N+RTV4ODCj3FAl!UWs!hs_hvREsiY_|Kt5VCkt4j6DodX-HuqFW428)A6VBK!v% zhYk+%Gt<4qeKOvj&Ev4tVCBz1W5$hEcIoSrgei}XjTyWsgFwkKrdUKO%f^*_G%bGR zkgEcL$mTy(Ja72URH5gkZ;Gq!#1r_Eb0zBB0Kh3fL$MTpA~lP>9F)>17Tm;TEg~ZEPI3!Qc~lKjO1eRv!6t?JDJtc> z?}-s~zusqKd?2O8#5CJ8r}3-Hm&=LLmyDGN!GojBGTiK#81tfL&mayTPh=8(cN$hh zg)vMn*5y&X(+G6)g&X*)AszW5<5DkMEmTv{FYnQi%3WO0&*A%-$|p8LH$p3`+h#YQ zJ&IokX7In@)AOxhL4yjX@4!xUG}Gd_6k(xHuc*m!UJCv>-)Y)eRzXRk70izlc%*pN zo^NPG1jh<%^XK=JnC#%zLK?PQwjWbx*PEz2%ge<-7Ra1|;6n&<8%p_S^}Dn-lp?k! z(J~7*_6(YFo1~ah)%1|->{Hjo3)jxS6q+ShDz9Wj&>Cix+n{mIN<)pRg~(fshH%&M z$cpEo>eSQ>4>zCG(VvQ~pTBK1JT!Jq{t+j8C*$@@?eKj;eG!{e=@v640M-+vMqNa7 ztQy-p&r1T>273ADf)3CkB6;B@(9S{p!(k{kzxkH6f3ovLj?yDxwLFaoOyPWlhkrEsESziPW2k;SuSfXT_$j*`9xT_|Uyd2RPJ|>P~22;Q&bhjQyb@ zq`s-Ic#)~7_zDEsU|0!t zZlMx3DNyybdc;q$8Wv$F5bm9I7XsMmQFRK`QzXUz%Cd+0F?^X|2E=w0?Us1diLucF z7H4rkj+oKs8BI9}0GC9d2xAyiINYML8Tfn0U|o69DlV<2=|fuc zcB0+4V)LiPD{phW!9!D^5;#tTl-d4!q)t>h z{P=gbPsp=$L5GND?^>8{cUjiyE4y)LNv$ug3v1ga1wR$=S9xrQOv?1Mdi1tw*MZe^ zRx2QWWD}m%x0YtO`WE6#(Oono^X#q8+`WT-0pBn!0b6*M)Jr$d7*@Y_XnKvXjI1iM z!FDCSe)>(SfHU6#lbKZYWk58*!1Sx7fso7*LCfoZza$9LYrBGK_&osUO~pL|qABJz z;Mghh_!4+p4cqCAr_V%u1BAf=P$Nb-+ki)z{S^Y#K$s8csnT%#v?W5oPZQnj1%I^( zTF@NXhoqo+vl;i1DNf{4ovtDOHeM+!$#$KuRgsa8UnQw_F7ENFcoq-^nI}8~p9vqD zbKFhiNyvp?oxwgBGm?q8@go#V_5H&k4ZEjZwSGCtie==rEAk8dA?fzte4E8MIq`Ye zlS_w=L0t9o!e_C-vpLw-+F$XWE`}zL}RR78Qp^yK-lLbnE|8Trh-hcKH z=<x#<=MH;Xq{rB%iUN8aV1%>_yC(Ul(&?IT*_nFiWtzeUfvCt;Q%IOoOAh;L*^7 zI=A*TUt(Qev2u$|O`( zEXmFW{;G)^DD)IdC`p%j`|;gs&~e54DGKNBpM8;L#-Ea4*mvqBo%}SLX0EH*nk|aD zx(t|)1)lX^ZD|AXi#rblb|P&NGXGsLabYt(Wf?a|_Z7ZqN_T}OHCz@EEiW9s@9snhk~ zh*j_2@u6=fnOcvW_g=W}&q{b*wQ3B_8#goVZIW{T5L91n^nN%^wfbJVQ{a5%P-S99 z(^@5gpeM)vmCc7bSsN{pTL$$8l$+JQMt@b(CgUO~ro?V_F0*msBCTI}ENb(pf0m8w zjRu8}6qX6FWM8rb83r_Ri?b4eeSRSoCrg!PfTgCpi_Ud9~9&5vEZ zDb@jK8mM2mglk$wP~z_N`RKuj+{eLUWj00Q8L0&zA@ zAJA4AUQL`f9r&;x%1JF|nk|7Vfis2AZh)ofMk$B1qT~jV@@_7nr5b5|7lxIR#;-|d z-v8=$%i}OLCPDS7Gajmr{(evI5DZXOn%+0eAf-`YzuF1 zPiuw~KlD~0od)$TElf%{&mx9<$dMHIH|rN#&OD7nW!OoGW**VeDQ8YXwY z1ZLph-* zSvQ*VjMn#AUnjkn7JD_sgsgq@c*g7rf6kx#7K+=keokHsAAG8#RYQ{fs9j5n>kuck zYnRM(;y>-M(}Pz>n>2j(;wbY}JdH2~jg=Wd8kH|`7mwM?<`);d|Ku%J9VS#d@7woD zF^|8)h1=I(y593=ng8Xhh5!S`CW5(K7AaXKvE0()nL+k}K~!KB;NbKk)2>OTSf01FTmZsq%J{WYv%v@Lw>RMhFb zOM9-Xcg3GEgE>}sN2ITeclaHU0s^v6B9TqlHelq_fQS}9t!Uc%lTm;MLx&apl1?{D z3ghVHd2rq=}#6!fXa8fLiOr~|~cj2CP)nret}R%RHpWZYmy zOSLKn(q_KC0dt|MM}v+nOx}C$FU)l(>N}-z!v^?PaY)HQ7T@&R$qtGl#Ac|`_JJNI zzaVis)7HAN?(@@TQ>3qNd0wXCAt8__VpOW>@^7vAx$Hzxl`{1>oqO80c}>7e?1W9W zND%p$BkLj~mcFb}yXaCtO5rJQXZ|u7U2h%g5WA8rlJH62m4_S;m{6R-^8%xf%K6&F zIG>@UfGs)!-@ajE`<#z~7}l*I|8V-?M& z7#ypX3B5BcU{YO=r=?eIn=(2INIZAVAS*on=^@*$gT4OBCw7i| zjyJbS`N~dm?stW0w%{2Tn2bY|{+LbWGXP(Rp-UNzvZc*t6fZyrP*R<+=?28A^5CAR za`pS5xS);l3!U&weGepC#CcXt;%%&+zIeE7T&`aIiLPW??&~4p5lF1B$+$l0aLa%p-uEI9Y>uCa~qHVjKR6yJ(<{o!t`~ zW$G2pFXY71d!NN#N{oT8ZsK{N6Tj?mg%NOH>Do~*NkfAFrKC4e{z9fFkJ>#^?K~K@ zQlVC{f&f4L!vSYP#ZV;NIR+3uj-?iQjg&z4s@0}`v8 zosB^6!vsdO>QS5a=1X_clo!s$ zi|hO%N`GmKP@{>4zjdMV&pK~qt?~qn?}ZP*llpqw$0ueo9a7(Z%&@S|uSRxhj_%Yy zPfZW#T*!&wEMZS%pHPFwJ^!w$C;8RP)%&rh|AbN^a?hY5_Y!Apv+wPjKA##M(W%&^ zpp;i%F5VnG=e;LF-JvD7fzQBE;$F^5X0{z-u4!+ei^2{;q}K5Ohl)jm@3&)HUh}2R z32l5vHZj!Kfyn;jL6w4Qwt=TK0@c>qVq;t~W{{(e~>=|I0hxxMKvhxCaH(U&06? z!H=)kQfr=dIZC~Wl%_+47|Bz-SlZ3yR*;aMBtwMagaN3Or+b7KEHgkUflcg>t$~qD z=H|X#UdLDG#ZFG%ue=Nke`odk^$*41cF4o-?GQQ>wgWzjyFltFL9ESyn&Um1B|!9h z64w$TaGo)u{wcTci`BlWZjDKQy_on?_pb4=;o#YC1mwC8|ML&BaLjua{k?(P+xY21;XQ#+1KS=+#k1Ld-_*H58;Wbpp(M~H>4>ypt#@V;=( ziY1USX+bz+d!My<<3<=1Uzu7rlJ1++|yCe?sbAJ8r7RZe!C6qsQEGSAMIgm}JD5 zjZ6YFi%{Z>mKpd8zKp^BJ$PN6oLGpZ&6S3wUAaDP_$KI5N0C$Uo2YqHD~+~0Jx`wrp?p1_PwT}p@hRAIem!E%A4Oei0*yn!I6nUN0 zDRoG}wK6A3wdGDr_i-C*>9?d^^)UYm5A23=u;y|O!FQ;}0hT|Mmg@zt&DzW-+};e^ zBdh=+^~ez#oGLVpiQbEtEZzo-GrC)X_lAS#4e?)w)a~_pPhd?8o%&B>8&AGRxjpl8 zxXim&-x{bVvEPIeWRy}A@ligFrjKPv+qtswZbf?WXyKS*XvbIG%-SMaoOs-mPRZRX z=Ieg32E@A4d%Qor_@t#B(P8_q*M`k^&3pskGU_R-FB~l9P=1#k$UGit4km7Ri*5 ziH%2F@(PjxjA5HamSZ`wkE$H*>sz-;VULk{KvPKaspyy)y_3)H`iic$rF6c7a`%7E zfL86ILNln)`cp4=grzv1@mPg)b>Cl z@4Utx(pSVbu~Vz7-R|vqualbnSSSFE$LH_kU5DD^1yKDvD22G0!#m~0H^G$L1j0&- zx$wu`0#*Mn-rDr4-uOz>Gq$Ra@~R9 zH>n-BiHkC&$~rwHA(xHUAzfAPZhvlX2~WyRPdKE6tjISinX7y}$SUb=Q1Zlu7s4uR z$}+Sr4VTo_3HJdx_yw=U2!&7KPKC0#&h0en5qhrKex@ELqN*dT(Q3kLQedz`-T31Z zcNj*F`XD-y~)Y9QsZ zgB_Zw%O^s(mZiGGg-WJcF8T1o9mUog0I~0d=s4vqzC<#gI{G9cx{ZC9G4heP{1{Ps z&sT+PImj~OkMr5Jc?9{`8oY=6u?%m4Xv`}ZhSCBr!})q&rsRh&?62M%8DwgD^^QAC zUY;E^-?N@;bm7ZbTyv7&+JVX=@orsAXRs+^W4o9ULBqFcZO2pi1nm|zCq;g8#;PY) zE5z}>FBFxK&ho0=^=g`VEh#+76!(5zcxEnxiAG**qVdHxng&s{Nr%j6;4v~Zu~m#W zHwWr<#qs31ESTvJ$**?O($tLZ^$gc{a1xH3vWmWsiNgc5HaZ;ht-j_PpOw8$H0&{cG`b@IkHH!ee$V@VaAM>$h0W;DZ3jlL7ciI(Dy*YU zKh*9Z`#w)C`=s8v8x-TMU*{WDxjhTg?D2Lp(Sbd;qE1eR9Edp=q<}pjK2&V8ZZ20n z(}n2{Dcwn}Ol&|$zh{<9fqX6Vl^{x_z+jl^USXA)QasSi38vlQ1DJ4z8|W2MH=IHi zV)#dx`^t*r`4AT%qsZMHryhEKd0xUcL&~?g`02XFk1-(^`~60o@FIwh1)|&{Z1FgE zbTk|OR19=FWI3{BcI#GtA@Kq1a2o9Qi~#&)sN#!cmyh^box-xcg`=QgQuO+F6r`GiL)!43+%oY3p!Dq z{S41leKoBabOw1A6t82Z_>=BqEVhtVKM^+uFd}1mw!C+1HCHc=qUaVBe^)zZ)iuehupZLzU8-kg zaGuJKE}Q4PbfxF>RV_hc9$9_cPpNB_P+LKtO;d5KUtbkm8cwcqwit2V--e|*QG;@g z>JW$6F3@eRY=Fx6`}F(%dnIps zy|-<}SGJL`t+%(xr=0Pvrk*?Q=xd+xmRzHf9|!R@vl4$kz)Z?#UXBm zYJnkXnv6Qdv-p_aUU5mUE^~}@b)q`PgSLY;U1p2J=u)HNY%YN*We`$}o;m+CC=|X$ zJp_1AT^v%}^5wfTbbqw`VSKF9xO&f>xMf|+T`*!#F8AlrnrwA+PU?8I34pM$b z7TN^Iq{CY>Em}0vcV41ovQI6*b++jSiWMJ{mo-)N1=o$lOO0Vi`DOS%Kgmx+(=7Ty ztlPBh_tOnbIKxP>hHtEfEjH;LwJK`(zU=k`t5bFp4Ut@}^#@A^uLKS-M~4hScIBR$JZlk~*s7tC4U>NB)m_z+eSlQ<>*oW^6ZwYK%|vd|-4nNY zOz%{I#+^aKWmLcOwfL;TYcBO)YokQZj-FiOQZ+shaOR1M*pAq475jJtZKoYtMQ(Aj znl6lO6e(Nm&Vh~36?#!_gaWO<%XcQ1c5ENL6xL2{FgoR^G_BrvU+BK**Z#qv`MEo} zXKtl}rWVUL+4Z`%Ru#Nvou;|ytSsCoU>f*=Pd^bM>{}K<9!bQqU#SC_`ZRg>ln$Ui z@gwhDCV-vW-Pmg{0O<rI2nx__s0Q3IC-r;^EL}{O>z}8^$sK;5+QL08>W} z{5^G~%kgi5Z9S0!ECt*Qi~i3{9AHRX2;yXMZ}=nFd4~C-{;| z8@4>s9gd6Idg<$Z6Mflr^D^(ikTiX93H`$Iucy{!pKM~%RqzeZL26lLV|zPW^GO`? zOT7BMXxLp~AjOjOmG$>_Yv8cp@zA};yS!c3_I3V^i3>nVjHpJXb@|RS9*P@}>jDjq zjsU&^7!*&nAq_wOitXPAiXp&3bW_Ut0R?n80t3aRF`@d2Jzw8!8wW-G_2sJ68L>^~ zegTJ^p$H@jzm-XNpq3Hfqph84v0DyWq z`p_SaALRg04!r*yuPI#F_*^)Py`DpSS;7H>MoY@Az>IK)^?z7=++4}K|e>iOY@w-3^ zFijTZSU&OlpT0-#KYZGiJj(=)|qT=^Wvaw+b!uLv&UJgW(fJLU`TAC`0}DX#iM z|M8g){Noc3s!2(qnjyefVe_wV$C6z!i{79D`{yscI!Ik7y7?b3X!PHI zocid1(Ov_v>iV(3-oN~RgIlzSb5_d4fgY&mI$!s>VDe?4qCm)tafG&1mD~vLCB@+|FraAR&1f!e%5*P z7};kCFgUE;FAPZ!rmk<#6a-{@kL6TYlOr@m+ zo@%DKrc237W54a(8*%o7{mU&P6#eguSOxb#Vb%Z3JNh5IX&vG1z+C0;+0_P-DVSEi z@WIPO~a4((e)B z%pPH-5*z57`02#xG%e-r=#0=p&GD7ITC=3&D4+XTT956~{}?QR1IX7(rn}HYFyCxk z6Wh4ADid3h5%Mq3iT|bd=Ks_~>tCO_?SnW8$6o-#UlrbawL9YXuB%CK{43*rp|t;S zQf>J=)|Z_>ZWa8jawlt|5BlM~ypXlV(EtB){Cnp0|Lqj$U$3Trb!z@|2Ipc{zp$Vir(4^c5BwE0T)aX(&8DTeJe zjzjD-Nw?*EH5Kkq)KwH*y5p|e*`Dr{(#gvHI3pXoC-rXQ|ICAAH--s8cZ!YhuCQK7 zzXfD`<0yk|(7bdK*nIi95M8Y0q5OYVeboT^v=Za8>|-g!ooU zr~2dS@vqe1)j*o`XM%Q~H>!%fWZhCDsr1w|HNH%C?r-v0nKno_yp;Il*lp4;xs`JC zR05i(QIjUpyk`^*IG>#G#0w$i^)iYL=o;V?#Is>LcWb`JQXs{%cdLxIQ;iS5bf0y1 zQ!wyd#?#C&ST6_aNMbzHoDM^prBM>2wjSrh<8Cz}?jG`0lX#?gN5|R6|A6#gi&w_) zJQ<;(hzj$TaFXR66t%8g3!aT{tgF}zhB)N~k8D@&2k{UI<;m4eg z6hMkSs-%Oz;ZGsf`A#f2tj5vEZI2fuba6CnY?|YcT82o19J*#j$)y%b<@U_|8dGrh zwayKttMH5P9lkMV-! zv5Vo}WJTQA#(WDPCAMbC(bAs78$mP=`;muLv4l4MxL<7v z@gBjoF`#YlvNv6Q>uT$!IE~ELhRb4AVSH_XR}PaRLOox+=wOt{mSm_}GQ#s1S^ceV z7RPO$UHCj&pkaG+sgDz%d^i2v;h2*tGu4J~ghr6%yATJy6@Bzaps{a-o02KJJYCpc zT3T)j{izhl8F5#>G*e4l6d6Ykl(aLs9zWZZ3&6=VLv_R}kuM>ZbKAZS{gk@}Ll&uu z*9^?OeIpk_<4KLPaJ?t=nf49!UmeYcQ^rBFL1iOiC&G zS$f21V&1PsoS@cU4w+?ph)Rz}Qm7vDHNOVGp;V&8!{Ke-s_4>|`2R@2tl{AbVIpwB@2h^*S z^uHb%1GKnFEI3mSd6R&ih5{3rTO80W{ep;exFD2)hS2i%QnvC4cVpl=l}(9vo}N#z z-H^7FX`FOSzSdoF(tv{grOoCCk1fxD01$ur(mHzDhY`heW`=CLudQIJt1on|vj*m< z>!|JDeXGyUY!uJN-a%rG5O8*$RHO!j)e%s7^ z#=JVC+dr|=?B*B*#(U%YRjD`7^7~6y@5}YdkDp?_+4x#~wXQR;Ze`fEQ;X2r4u+Z*=CtR7AF?66rNiT zZ)O@^)wxiD_&{!YMfDpTx3f3F9uz+Bl#dsuy-8)izH>WAOp{~Aqg&!t?2zYk7#@G&=!I=f7W$1zfpw|;J=h}{Q6#BXc~8eR zr&8*E(fZC&yY1zy%P@+qb4be7j;_J&IGfF-@)FXF@AZ_)Am@>r8jyARs{e*+olE&njVRi8cn`^!<4f?+MHy#o0PK5ed ze=;U|8otf^nExn|o=oBEfQlk{af3CzhxAh|PA!iIQJ@H$ef}j%-{_u{wnKNwiJzsd zNoN8lMV2`l4^_qR~6t zeb=tjkr%B}aOy`JCw6_(`n;ToxYQJEs@|!$xiYjm*-<>7DmMIUTT}VqjyKTcG~n#Q zRAb!(JPG(1X23MHKO8P*`3`txK?uGL}Ikbf?%@NwI$1_Bq36 zUXc~+G>De1z#oO*Z1nC(*RroBcnDJnzG5)bioWj#2z-0uu1?}J^i~V>567S#On&BY zatoc=o+fq{7hk|A>6k7`>UaEFn>AFEVz7~G`# zNT;KQH?Fb=j(VJWFY@Rj_veU@N-d3GPXMKUisBts*o+H~fVP7Kwt6)t7Zz;CC&I#V z`yWde^!Sbjx)Xt6Gw4YcA>B-dJSpleZW6LCTkk(c2j$)#!Xs3gP++FE{5s zwG#rP>SyOJ*49q!jmFaXPM`+ZQjPnm$RNt{z9cLn;Ct#~)e|Xm>tg+E5O;2aASsJ8|2)nrSV*eTT0OIeFgwx=ueX zWd2Zhp?OYr%RbuKcD=4=!&A$7@PlJkx{`CHWzAYQs$p}qXU{x#H@X=wxXR+iiitc| zL-Q`+BpJ`?+73fD+jHV^ai^V+q;xrRKJ99{Ee$8+F(Kg)P8@3r=z z@YjSctj@F==Z0@9#CV%d*s{wlEw#=_;4tVn%Xc;#16Brm3Y_d zm3mDzISjUcFMnlsJVb|b)>2fK0&{Cki-{a_?OAwF&|lWu(&HOg?5fDp?Uph z^LFHv$0b6H-;9oZPwcuGWpLp4xM_s^rT3EePk%c1q@{#85Z>`#3d<848NN<(AnukH z?!$g-#WLVG2>mMuf*wcE4^7KP22tJxQVo5zDZ)=f&r~70f)Xf8x8dEABm;Q^{wfiH zwmRdx8bug8Iv$WSNKM@sQPgo@A0uFt8bwPOX(k!Bhy2QNE9*YTpQRQWE6J+fn)LTg zaS&L)JhpN0tEqrkU{kr1P)0b>6kBiMiLGS0p#IWuFX>LQ^ft~Tz{ccBibPY=oRi<6 zZ-l4;5?g^90ES}2PefS#m29Cnt*F_i$*ugX1|ulmfipt*j8xBZdvnA*&2rjR(r67dwl!* zj^lfe_mB6FWgWAa$-l|`8$8-X_KBBff<_bS$bv8wzRY%GvZ`nR|4uEjqfL2 zdP-^QK;Mbew$YmE%!(?6e(4pj@ON@UewN@^2PcX5BZXDmE{&ujZ+uD9WK(SWx=Eh# znt`5DPLEy@hQ&fPX~HDqy&})>Ik; zg4B)4aar7Ji@6gjjTcIPIl7o7JUV#Q`+QBgc3Xy9HU!jTp)LagQm#%BUpBbeFd;I< z6oDUuMS2A@S`&9sB_+dMwc^`b)X-(EOL|dfLJFD_<*G$)I9iJHWbX_^CLmh+svUCt z2C@Z9gZy0L#iOB{1h-eXw4sVs#2KO?z?=?9?dE{KR;8J}PR#pDB#_RTBXSd4lImSn z5#v+C$BG%|AERZJtqbYj(MjoV_Ns8@?SZ9iu=j4T(2=wR|kB<5;&wo1~^T&;Vt?Cg+hE19BL zV%{JvBJ`kd2N4YcsfLmw=9hCF?JAv>9ZK^<^nW4avIp8|U9ybVg~jSJ7^S{8H6`L% zv^}^if9rmxtGR%`V`kv_)@(W_*f%R;qX}x8<@CL4`D@{2T_gW^2SV}bcfiA-%=W12 zXcFW&43TkxFmHujqYU8FPV?gCkKr8aRufSz^1e4>m#?_p-&voXWiM@r9}s@@BJlUy z_;6ENiKmBYf?bkW7@ncs6?)UDsVj`0#1P{ngtU2JfUc=&9IbFCY;SjGYs%8AZr_OR zUsO!%ylC>(?M@1U6){49G+QB?R#D^pP&In{k6PEpnGGgFUm^Gq>v&AYxYe=3UM0&C zh*n*YQg^&ykW4`&yg2F3uV)C5h`=!gv8=xz-1Yi&GG6FD zTr-YDyG`v9g7?sor+(@kz7?laGl7WK5VD?muno(u0w4%+B7YhgVpL%p0Gr#P_>olQ zU}fNS4wkg2+>#BwSJjWmJK`;Q&b|(hRqGaSJJZQuahOQbaACMb{ZV5Jk7f!m>1G<7 z*8|YJNmz%9op-4m5))>T=_-`&nk22TJL>jrhg4n5^u5Qk0}PEIMVP9_T7M2}xvecL;R1eC^Am!SAI2DzI|NHyu;OSdmj zJAGd2d&=lU{p9O+zj$i3kn4;NN`4mxMT;2V4tZ^waAtvJnLSc&nlp+5Nb{8sJlTi( za<1sapX4K}*uyD&DS?G_<>9!x_{{2q_V=qmnZjc>V=!*gTHm|!4-Avdz@;?D1o0gE zj_=0L{69-2Wcr=hoK~SA=RzKiOzF3cAdokqvdwy}0-($58516-HILqBCm0JJbH#rV zw0J5QUn^2JtvWvSLA1wQuN>&gvy-O>HhV!F=0BW`4NRK!s^T0ST~YP3d#J5YHq8*A za`wcSl1h5;4Z`dTwlQhP(!<|D4m5~=w(&hX>h;cJkP zC+sX#(kJvB*%wU;31W!e=Y(Fsxmbl2I+spkr`IqWC6i&B!cA%RX~~neTI}xfMIlRK z4{Zc();RB5?7(Gg{gKes{aSO*9=)lKx3_UJDd?Esl(&$)-BEqF$?2n!*uw>V%9{mH zEWAcCM%5qhK(rr^c*DdGKmx1sjX^u+h3mNe}vvd~ce~#->Z5oDjaE?SuP<=seF> zqaQ4fN(!c&t*|BAH%8p2l=%JoQ9Ehqj|GjAuiKazdXmDq8A-ubS1ypW5}d!FzJ}tb z2kE{)k-y;Ce6v>(Ax5f?@JUL7)VTq{nX0E7v@!tNna6@0N5UB(glvPc(mXs~G_KJt zTU6x_-bl6|SF1DoXr$<^F!A#yli=BAFj*gc+7v|aE8qB)&Y_s4z5|z()Z4Y17}Y-x zguV(%U-NfB z2dR2e1Ft_H-@D+)E3$_^8*==CO zMSS%cZCMe5Ny^P81Xo=t-1u4PdN}2!fpYFQN|43Leh6|Nys0CP@Gas_5L`l?l4B3+ zAlTquOp`-CzR{!uM2vL`Q_kqH2zv36IxS!DYqlBWA&5rzrlp%K6ZgkY?orYtzcIw* ziIZS4dxKZH@&t+RIt}ZmU94=1d$J~mPn+f=YkK*+Hf~rZNEy(tZThf(ot}*}62vkR!=jj)&xrnX|B`L#VwKtoq03fLkc9w$X zy1$}hHi|su-ZezMRoesVFR~}OU$Gijpr7=Ie1G7^cw%~5fWG6DRodO$dMQAf3p6hr zzOEO1EE-eg`@OEEsqakdP?~#5_ z8S`mkj~R1$1#^#On&}p|3t=~|8t-N}-`ktIpf_}x(g`Fkh;Xnop%|Uy?_zndb}3=G za)asmL(@wg5v~4gB9DDtil@`iETROmHQU0^O3IXXUX|-56o=j2Cl_HYFcA#g5C`BF0RpsS^CpA&~Vz!7etr7m?A3^0VO{MVW3Knr1MZ70>TG+yzm z$C-MJXUIKIUr|@GmGdl?005X8)*p%36D>;P z7w4eJEyT6#!ZlV4Bk*q*=HG`Y)B1iDKZ!L;9aFc@`Kde1krE3qFcet(Hv4sUi!A}=)NdTx)DJGcTZ>cUJmdsW&h=f z+_VwIaT6%w7CDZ0{|TbrTSEM13Jtox;C;uENKvMQSWTJZy3_PGpAO!B!T! zaTN3Qwv$xtzkRmpz7b3Z>qpNuE5ay_aG(@@s5h>SSUC7 z0C#&xoeSWqC9%Qg!CwG&DL_B``w{;eM*p+X;hXaS43HP10?-G!C4dLM-V6Z00RrN` z9NH2p{B1%tJD{Be9;p9T$7p{oJt^P1QVZ~3qXGfpt&;#?y-qh{@h43RknsNdA=ie2 zr00f*7Sn8w0D^mU7vL>ZNd8ooCIpbN2H1UnJ2K&^$=w0pK{QDG@9Om$b?(c^8A!L4 z%*@OzcvZOxYo+5Woc^475Nh3s++~eHR7-CtUSLa^?jm5kQOsF>e+T;J|&NFrUp-hk8 z>+-vaDt=rayi5q^@tv1ywn?21rI>NX^FcBrEaD0QqcR&LilL^zY?Z}@k56kD2=0I zAT{zpj^GDdPdeTPY(qFmhODsf<7I!+OiZ^O-9+@Z0MV;wXAt#Wb=rxS%qoJb@wAzG zOR&er?wfoDw-lyDZ+>bcRK`3>lc?2LZn@^q+>@ex>mVJI0)FWCC|-y}kFWG?Dw@W!A4`Ncy&GMT)_H>%XG_)yWzLD7uQuh!rz7@5%Q zB5a4cB7af!OrQEUht#))v_=SDoNboX(V-1w{My<;GPJdgVfeIjwMu0U)Qh`B9RpqV zf#0IAJ=G8Hz~aBZ+BU!Jb}}Sk5v%F6WSV^QrM7X^r|{C)P3Q4qWpAH#fuh{3AlV76 z=5XioPX)1}Qjz~q$ND#gtjK?6s*Dz3=hk3MElLup71+~S!>mUo0WG~r;y2309K9F= zd`u>Co-MvK`sWwSQDLnad_Qm~Y!=t00ItPv_3x;oJZ&BVMDE?*`pKMoxUWb3_ zlMxBHsCaxghrGT0?YVMB(KqFNT!TjQc2yQmXD^MxP~8Y}maDmAJxruV(m-YKnnFau`cjuH9R>-TEiZOT-z8 zTtN2Rjb~RcsUukjTAC|k(K@=gQ|y!Cv>d>%)u_X#8OZ8|*P_jl;)6dbNGYTZRT#^B z?$mGK9qx8uK`1RA@!PIi;hkf6!_7TIbSXruq(RvX=*di{AtB=|A2hD9~N{Y zN+tGQO+2*OW zV0}4<(F~5%oH4tF^KUSS7>F8)h1KRpT_4Re5Bq`>itB%AK^(rYy%Q-&U| z_RBX!!H43%W$C@$uJ+OPJ*K%j+(uXU37Ck5!}^pNx@;7*tLyW&HEXI#dXz7FR@2se z2dRCxHUu-2byKDqoe$n6ytyCY#H9^Vc#S~Q2iUH3vp$(z+gA}mEsvaq^el7=AVABQ3pHk4m8g$neS%;z=wpMiZDyB_f z;>WK1>HCm#Ky5>4T^x7zmnlu>GM$RvP&dRnqsw40kF1xq`lr;m`s6}CEr$;&A5C^% zpP#_hyn6$c|d_lWP9Z}F1S4S zz>DBb+vO$pODAQzYvc8g3ukx=iMY+dIRu@vvQ2SbvcwFprTU$y;JD-L>@w8Zq??U- zfqc&He3QHq4*rMt6Jr~;g~}3yw5H2M!GQE!z2uC&JH~vHV}L=|c;$mh(1x3DEA_bf zpjk0c!%_004t}@_X8)+^6OgJG*iAp0f8YXo$r|QqBru}>Ghd#mHl8pu2u#)HNOK4# zCQL{2VaEM@T}HQd{!mD^TOF?4?WpdjB)%6YB%g;TSVbiTR`phjlV6X@!~Kh0>yI?M z>$CD-o(1a^c(Dtezpf302y`JAh(i%2fo_C-(SaDB(IP$1FY5gFbW7EEq@ua@iN;FAj-$_G*Idzr|- zg}Rn;d(4k?Y~&znjBP~9u^|et#Oib_{rSgSkE(uk^V{SxGhL?Cmb5=3&5L>=+AJu;)7GuGg zR+fGld>2wb(OsgkyV#DaE`6gaIe&Wp=ZbzaW(ng1+Y~+A*Eild&H9m)H_M>ztUhoB zl->Wj;A~m%_lA8d;b6sGT|bPD;A&$f&=3vqy29H}hfvxrLJ1(d$~)+$@e*L(7`0`v`|uM&q1FzZR?`c%yj!z zwy*qytwkQz1Fz0Lxb1XM9a-dP@4)lun+OfdntdY_^TkWED7|g*;n%%8`lC;*5qg&3 zEj7t5NUeWFh|zp-F3*N;rke!Hf8t=ug-w3K{9tPdyUZC~WSJjQ>&;ws?(VJYBE3=S z=O~WtD-VN3^)L-YpaeZ~aJkes*aPnR?0}xH_R+SC3XPub4=qKW#_hLt2SE83K$f^P zooLmw(-Dk(%e-Wz%HaOC=bE2b_?-P2EC-tin`6o+PDuR(_c1wkf@G|Gs!uzJ->!phdBt zqgUuSlFP6Eh0HdqLDi)@OZeR{JaeW0$96ABh8g_9qz08>r<-Fx#9lN34uYi|XV?v@ zavt9SM4wbA>xQ?X`Fg^#tKxE@FAgkft5M1Kb!b~#$40uLoVPET^Z)ULwr4mN8U-ZD zaqp&Q0u z1cTiZkAhtGc0+#@Ms)T}f7MHyaYBYpI2I^z!r$1kw2V16rRvS7^#EDOOFt6GnNb84 zzC(6gV$lguYXxt$VeYLm%dl^&PC+d35t=lH&^B**(pOt6WbLi5P{3_v9fxB_Hk!xLuUORI58(5X%b2kTPW!yhb(X>X*%T z`dqnPZ&tf+Go(#g*+k62qYvbnUF126nAeVAze_@2yGORa&GJ0F=^(-nWedS z`$fh#c+I=lRBpWxa**2Kv5T@l`C+NmI8-h-T~G-bM@Si10_W`B2sWy#G9_38s|4;I z_)cYIy}r-h_~~|Ijz>ViRQhGhe+(w7Q|$ohSK+nl^{kZkLhE&2vr&Tt4Kk)Ou;Nv< z(qIw9H60>wuIELZ3s?Djzbdg1+0%@co5YMR%n>HZ?hCrw^|?SAJ-N6FvYx?&Rq0ut z*7221Sc;0FtMYi~_p2G_|7qBQ{WIFBTn!D3*+9tQDR%9qrHJRKS;6q?_CXOV31q=z0Yp+VhJQ@%v#MdRv!73KTQl-&H(-@;Y3oz0C+#}xTSdzSd(PrxQiW@A zPDbib>xLuEnWqp2m;>%oh@?J~PqvyNRT!DaB}u@JZ+&{jlgXnUE8{6chPDuzFV%)YDcCd#8RU#Lx|D+Jdprp~9{2dGZ0!j@d%Y%{uV??fY-Wwj<|kCc=eKLsE^<$rXW;fd9{E9>gkpIXZgXf3 z#~6^cYtis^%zWEu1om~?827ZbzOD_))OWpzs4dbhY?}2))#}genu<&3{gGzBL24O#;H{c^SKcA@+hGITmnoTK-mc=F5^x)II z&r_CMjk?#~<3Yovc_UY`ZVEheGBXO3#fBl8Mc9L$WT?JK9R<4f04soRzo?L>Po_@N%R#m*5Utzn>R%6R2epXMsYp11#5R=LB($9>Y z<|}*q>Zxyv)ot7jS2SsJiNKjpK4VGt* z))@%dOVxSH=Pt)CRi5vd{#h~$nmr6AvC~Emx>3M$z3)y~7EYmEP1ec@C8c*#j9{$Bm=j>pr*2{TR87lp)fSUYZ;ZQKcxoostB39UjmwT9rl zd#E64H#ZwlU$HGWXr=$4i{mYtuZ6^4VFH=yEwvhw-4=WGDuj#*EWkzP7U0s1>C&vB ztGJqsH$EU%fm&!WF0_i?K;Ho?>>D>(u_>{*+tOD_$g?|7OC6Tq7QP|%K81m06=`}u z{?4Ti(MLrYX(^Btt1UvAhH>Z2K(bBqX1)Ie2^RQW@*C`OX?r>)^faZkgZ>59a}WWpHhpK*J#M|7syK8Ny!=2u1-!O|3;Qj6yo|Ownz)$nadSkHB5;>X&Tigs%Pi z)%c`28UbZ`-|!q=Es&QDF4PaxM`%qLb(^d-C6?=*jMmSl?mwyph7-wev+TqfYBGH~ z%D;4-XV^Z@n8aH6`Ow)_FdKSH-%|xCRk(9q`b%)QDD(e^!F*B(!7>t&l5Lf*%E~qR z*W-jrLlc092@%$BOG{FSL+qE&NF0H4jn{#PY1);o?77;H3#?I#lNBAfArt5|{+$E- z-79uH#pu(F6SmJAdAHj#49D~WN&>1-D$grsE7N|ER3%d5p5J}LKiHy_%&2m{o$ors zCnNp)qW{w~QTM3$!q!|pdLYzye|%&4IL~)sds6QkoVmqPy|!YF&18D^Py-syWxj*$ zwb(Iuaco~?T-iE1O`}S|Eu9HlJ&QbfKs?u>E;4drZx1UvB;y!)pQ84TP5a3EPg$q0 zmPdfL(ku>wgB%fZlSaC-3!q4b^|8R5Mzh%?@gP^6_c>r9zA9^Y#x;vvSZvh?2*tX7 z-j-u?Ewg9te_uq`ZWCL=n{a_qNX1J_M^5rT=Uq@w(Psd>oPQ~UjLIe&-~UO| z%D>n%&wl@xIb?Z@dQi4%YNQ$37;U6^gXX`pS!7ZkP;~{n438Ord__s6daHEHPzPwo zNSz1vI}CIx=e)n**tV54&S5gW2WSJle+42B9ae@60Ci6`ih!62B-`=C-0#rtgm;r| ze{Tc;Amka29ZxW52LSH_QiFYWhypj1fXa@MDVn3xsH4_ff?ch=N6F$zcmHdp5@EM& z`>Jh4E%`U%?cWw*bSt-MV4W#Cw4qEt0ucmgBbvb_vr}(Le)mL*zKFoR0@#Ja-de29 zggvKX<`}{!7Mx9Yrh7pog?=vryejZ7@e@GbMC0$paj-;$-6(421>RxuD)SIuLb%^& z2fjJ)k=Bm?pmOq`L3_$U3~Wmg3i(C$Lf~~*mJqMig(&{>Ai~64v*cvbLPUrikO5m; z0Q%;}i4O6Hm$ULxdPb=Z4KofkQ(R;C;zIE>ch=$ON@-k)rSH%i^jj zRLNYCOVINhX7GT zz_^nv7YDepCIV7tPjPmn^9G* zo6&C20oldeiri)F@T8@CV|;#;Db~YJcVOwbl5EPH@;S*(cu|P$X)<7X zB{{j##hPO63}QqLLhwn^;?F-6=#}2Pb->ig8@j1%^MI+B&;54Q87_ts*6qh=qCdf6 z4tniGWCYYfJ$ITLat@G(XK@CKHbW)AYHVh0i9Lt1M8;nF0r2JQ05g#iE&ArDQ+Poc z>D8>fV!gqda>}AR$-Pv19Bh9f-@Oi?>1>;$RQECDwTV~9Q5tZ8O zI;u%0*AKcubTCI8)((%3bjQ(AC7uR=G|`msFqO5lvj-Nj*quOb8x?c(VPEsPp*w|e z*G|S6j$5&(9IZfbap!YLa5V)kkl04dUBil@x!#%S#U!`YE@nCg`zKgy^BjJzxKbwK zjf~IfB^{IfiAjWebLZxvx11-Gd*8imj9m{^lM^jhlzi+c%GJ@%6G&W1kFpt-zp$vt zzML0)dDLfR(D`0>^GwN#l9G>C*ghekWXfQ@=Y8j-VqXd30*@N#Qs@7HX9#x3j zg?P!5C4z4GJ@ZLysap(;sEx0@|7;9F!4WWyo;&qf2C${T^Z$o zO;PjXj#!~jXTPe#=B~iF*NCD+a=A+%@_Z}D{$P!a7Wr0wwkp1;ocAhYFykd$K@|)C zW#RV8e0PuZHaa<*7htCoZ3Ngw*)69`+Vbfd!6Ae8+7km?XUj3hYvV#ipTF})%nWO~ zMt7SbBwVUCuj>JxNTNB0rmLpE@OnCDS5y!ii*htJ@b-Tt|Cd3@kN>J2w33Xgta&28wvZdEEgO2@ ze;AkOrZD8+3Re!lc8?}e)6)-k`9#~%oy-)_$~%I)Q*0wf|2U#u9hSWW1(dJ9{|wx) zjnMRcPD=YMP^LS<->uef%l%7SRWu*FhLH-CPxp*2c$|Kl!8nj_pD!mxM>VTiljX;h z`zDZw6aKH}q%#92e^8wAWSUUuy5>*?vl{b6(KqbrN_H1xFp^P5U# z1tBtH?s5Za54y5`C?m66Z;FcpRSrK#lrD+zzYMhZ_qaUONUp-)UpepRV`1%yTG0F5 zW4rw#(CjZC4X+#jUb*)7y(h;(N8I-lJK zE%=M^aK;BgyYZEj_j2oyD%etD9+|qP4XI=vzqh3g>A6WlW}Kp2R~b>qBSS$*{e$Q zhFsWEA1@1Nf}mXdXB~V1Kpxt#hc%kKu_`qP?f0zC;Yw7PqK84}%>Hwd=S zINwI~nc!>1-p#thNmz;eot8}8>BZ%A4IcWcF#8?5c1|`fP^79bTco()!@Tt!{ElB! zb90l&sEzI)#+!d!IWRM&rJ?ymLxWI|8+5YB-&~tL5Mgwl$xZoZ*k}*TF8?dTD*gXQ zMhG`E-ZuI4adGvsd3L&xCr2i$)KYhjm}vaVWeg#Rd{AhUP z%Nf|q)eLChiLM&h4Ys*L4|%QfXW+?iQ{Z?N!|&+Mlf@KmAh>)HhB*o096R%b{r(gW z*BzUpm*gQRa6U+>Z+k2y;dwR7KmDjWyEKRiz)*<`1S&rAU|7Cg)izOgLa*YG;$Tqd zKmYDO`Bv>DF?!l|(!L8xPQzg>R)Z#e0!zj987ReV>i`MnyDY35nA%J(Qtwrrn?LA= zUO54eN^AqBLi*>rFhQY> zJTH0ONnL2PvZ|;iYx~g{Piwen^iRIXJOTUb!ndVUlk+sgEKW=1g6HQ;4^&QuERta| zgf_^UOd9~%fvF`7ClT5w#<=~vutko=kO%lsg${FJ-!JQ|%J#^5Ml9cicZJZdK2P`6 zdmmrh>Toexl*@dkNugz?!1YliuBs%7d^>JLFjRa76=zVejAzf1OE*nY$z&>y23&Tf zKk>QW)RRpee*$EaUX#c7S5fxCAbDRLNe?y#teM^eRH%P6!dkLRGKQO*qCK~PV+ugn z4!20npUR5btOubs&CUJtKk{VqC#SKA^%wHJ{K}>8O+9n^IgBI3jQAl72+skgG+S5J z4du61kF(O#5LUBR+JT~4$>5uI$?qQ%#B{4yyl*nn=v|$bp-WAY^&q-JBM{G(%~6Z{ zyK1gfVd&9EjU9T>zqiU2UQk1w_>-no7T}YCD7<8iS;u=o_+Nke7<70c>EG|3+=>Q0 zRVu(6zev54)QL?ZM^H?jX8$p+J-HOOS^xEmY;wqY^H)B@OzBcp<_H@((^?&EohPNk zCu-c~2(!;=vfIvT67}my*Tud6^7MTHsa;t>-clpD+~t65Wu8_7m!(3G$zk!9oH`rVf;4T%I%kb~FR|5|)sLFtx z)9ncjO-Tam$lDMYpn*4&yZ89V>OX%A@Xh{lsesbqf9Quho3NIj5&uNQLYwiPjBwdm-S;>%%|LbkzCf~ zTY#{xs_<^XKP)K!&)RnZ_RZol9a(S9GsHvHHc6Q&*q#pj5lrkBn^Z?)yO(D}yh9b^ z2b>to?}R2%ptB=eO8}`vg&r71$EEEgN&7^cpg?_t1}3Ery}zi2LAZ5A_~C(MV_YVe zKFa{CV|Em_%DJF%!iR!TwF{}N3P9IRv+l_@{k%uR%5lDlZ z97;UCiZ6Yh-DLMSr%BR{{TPHCU)L;N{j{JJm->iF+O!Gs_nCZ1&Vy0k{p~(qP>`S^zdphLf;k46f z_QRrmhoOl!gzEbmKw z99gspRHKs-YcRY8J6fS=hUHFN5XH+yb(#OK_>r!)f6|!3aIn)$6aU!}GE5B*IZou9 z*i(x~EF>S&AFG5IjKS<+ky$^p=Y4kM;Mf;7##0@o-v^QEqDi(Hx{e-2pe)St$oyAn z6a5A+Z=02N#3pDGLUx-7W1{$X9`%%Z;$ewwd340Vs0{qZ(8c^L6{k{XcR3Ya@<$#f z@Z;?zu_V#w^76ZoPZ$6XQ{{AKjZO~G>y#>uLfDV_`07j0$d;Fd49N$3)*l$RWlO9) zmI*|p_}>~Oz1v(O9^l#DqQuWZh@c4H!7G++%78!oItM>$uy}v|c6R0qA7Q>pqvIah zhFc^^Ud4KL*a>&tGG@Z)gS9;MQ7MZ<{fwHy#!?L`yM%dK>Dfv3W4Z38!`C=1BcUWlZhNyEA!OUM!#R>J>^YS(7f1xH&2D8?d@=xy2{- zdEWGDs~!0v#Sjm=6cF5b06?PZ+z=;qruPH+&h^~4YSV`_y}Ycj0`WzHs>^qkDq;1{ zin$G(ik50;e!g{9f;OdikJnA-VuPB}F6&A+Ss|LnxgOR{miF(N>sYE~C>*;`2kT)- zc;pF)I|i>W(`hS7)Q%y9faljxY8uB{9r&&Bmk<&BZyn}7W^I}HULIAq>h?oFI1skE zB*h&a5bTcC*ElYAx$(D1E@(u-xK!`VgKiAX4c%~Ibjm6knO+;|^K_GSJKyd%t!3tL z0qo2|*S9Pbbb6iwEOfr%klYc_;(+7!FlG`u)6qkMuz7N?2)zE}-d%Geo}%yl2-HXS zbBZri##l9K;hi%w^XEd;>WG37ZYO6~NeWQ~!{VvhF9WYumHZM+je4KK3l-B*ow#O` z`QU0A zs3|6X<5qz*yb*=?y)h4pQI(l*Wiz5!5`mnrHqq1JmzYF|oV|Emlx2hzDxpyHf~6^3 zOhPvTi&A}ltQ4X~i3GqvDw7)Q8(@vDDo!pzQ+vi_^;~l`2=u()M+2`#Y20mYPM=Eo z*{dXgin70dSJ%khW)FzI(laauw|l_b^!o-%O(wqlYE|iR#rc;e1J(5*2YE5&ZG*>c z(X&DnN8&(t9v3AT&o(aG#!ek&<7OV;Z-z4s7CjQ@7!k8Vm%E+col?z^df?!mBA=6? z(Q>`ynpxQL4fx2gP^spt>=YlA5a z5<;WP7nc$)YM%WZz(58AhE=tl@13aZ6yG_+YtHi6tPPLfYeBTdxk!ukd~(y`$aV8Jc5S9_^ef)cOtI7<1(K%y?im1OG~EqHF@ z1T<33M{iDJsh#@%cL7yQtba+d=R0q<87c2FbpN+24`77#l|jdP3qO`Z6FO(vsyI zdn6qCMUjSXxPjt3f80FduxxWhD`la}ug|eumu!?Vep}P`QK^czh{*Rj(M6g~n#FOA zNXUhjJ4C^bw%@jwh^0{{oCSe{o~OC_Ywy=EXjeP$!zW)#7T%=B=g{H1mJRAazv~VR z$9H-ps9}Wd%I&hIg0X^Q?~v45^OLaMVgQBfQ$G6_@CR%R_lX)Ov6wcZ#wmR{=R$7} z0Ez@r49h8QU_)`_?w+p0gB zkGPp-+ftwPibK4ouKxDvTggoO^Ioc}>=6;1kbe&FgG;!d)nL{yRBSd&wAtHsz`uApY^sX+Ddn^j8vyNYipnUY#C45O6ioHG zcRC*-Ew@%0gxxpq++Szsna+RlsHb;trM=Ao`ldclijp)psErqll-R$#2aUqYx*W~s zjXZEI>-6{PBBXj<`P?(YDb90I@s*PJPtY3XTUScegUBD_GIs zuF>)bljd<@lMm#&b@Qa`Q9ZaThT)B>*Q}C_bzKa?sclj@=g5gVR`*nWny2^ZF}uUe zxs^rlaKAj-0RD`3J~o`>Dv~}Rjt)BGLKP*6&$ikD0ut5pI{U$H(%;(8@^t#~1iZSc zaCTWop^r(WK4FrjH^h86qf?#rmv#)&?S;O?%7Q_muUd-p=#WId0|`<;0OiP(;7Qha zW7hRWm*6pF0I_s2LXYTG#Waq@>QDLpJj~GZo$=A*ICRm)oiC~kwKB?X9@UgE#UGWx zlgVb!09w6#_B^1d0M%*^RL9|)8!I-M*lr`uN2ZnR@^0`wmKhQ&L~Hk%P|RcvfmD5M zHN{ROM1~|8kI`q)8E;_@EyFtb^}R&fPiLK{%Md@G;i*$|;ZdDxxeU!+1NBtm^^pl3 zisokkCVrK*oI4L?4G8bYD~4Q_`&~P_$OeDT^t)hskfrqFbEi>>>X1xcr=GEOCB1aa zu!8@LxcDr=QU%gCb4zYF=!-^kcv#3Rp%L3kAU2fp%VzD=G#@K`%Tt2hs;UA%oIpZ0 za}7deVJ=`XkUNvzslZhk_cyycO6@9!XY0!s5iB9fV^ba9DDOIzF|~6~(SjQsNioQ$ zdu0f|aWOuHvltVnSlg``caFc(n$#G5&RaH$7%BF;E#VV{~hi4$0N1`k6$+}VM&4q5XEU~pd;zaZLd@i_m z+jV{;RN;|liL?2Lv)=^6U7GVzzox}D8ZWeqrqNvY+>`UId{I0jxH@fGxzjiv*`@r& zx_>0@gB5N*H31W+?OG}CD1`@VgZ$r8`6-Z&dd69FK7PC|dBU_1lf6~6ZHM8>i%H~u;&I&3JMv$p! z3)gVMy$$1U7zr`_?1a^Im9iZwbYjDHS|KqcvET({ti_Wq#>>_offa4n1HwSqD|qcV zL`J7oRsQ@CV~C24vJh&BVS19kyJOY{&Og@@!>*{pF8Wzfq%)k}!>nu2#$>z-+L2R) zSRbJxFHHa>*tnGCmRD5>hq>&H5(JpLyeK5-mt3pLH#R1@U!d!D%ub}1Ka?K4Jji_S zxYYINUQd{V5l*g@xPdoI>YCCwcfC}Fw*i?q4KK6NeX(*4yy`v>rF38W{M^E477{#4 z{mh9*9VPf!)x{rvk^OhT^V!~RzilFRZ7YR@43E-r3;XVnN&hSUaGpbYofCGG3)GE^ zw3Qr3-yCEdH9X;sA*oo5p^oVvbg~6)T17^ndM6h{l`lWfA~UFV95a5^5KZ&FFN$C@ znZ)z6TXqYp?NQc>w=F|66_zXZzyZH+O);BXA$)1~4zB9ksFa@>o%Ak2_}79f!}<%* z&qq|5HQs2<<-wQ>sl$4?>Id2wgzS`Jh+yEnldKbcIb!m~*XHDvC@G%r>+EliaUaf4 zS!cYK9dMJe2GlkJiBnx@b2yQ@Bgx9UreMXFC(&mAdg{JFx@-!0MQR$3>RoxJ)Ajbd zf+GO{lSJG?q~hTj(%JQW9fJoh6C(^C&0I?gcRSiZ7&%4>)C! z<4#k{hDwqMdiD{74l!6!dz9NR^)PKkLFYLmM8FbK@|F|F?P0l%dBl})Y(iyCYhvc& zC)i%*m9u#cekCmRch#h_4wHId48Hf~1CpXuWvX1&X$@nofVa(!l}jLaQchp}frogp ze02PQ`G5yzM_NREF2C;U1Dk`WJ#pn@Jfs7RyGT(nBKE$O9n|Pz)OHHd5J=+AyZPyI z(`4ZTcYb?+Gas#I-u0>08_bgBJ>^zA?I@~{z;;Pi{Zb)zPy$!cH<5O2aDTii*r}2@ zrL|pH?=uwgSx!xh3#8xB+~~>DTHz*J6~rUN2mf{sLQnl3#`P70M1(76M4WI|Jy;Ou zzUfHPh%O$M5a($b4I5C7a~u=UOeEQA*D-0{N{Mc%-s#~vv>~?5i{rX9Zb1y%=#j0Q znj~nXTz06x4v@h(yQ>SUmqMjqlDjg{JN4xUSCOdK*DtKs)9e~zMP4|5pOLF9qOR6e z&M0iv)urbm5^fFt^jY{0mrWS~+fKAKxBNv&-pi20 zf`C#*2$2#(k928LLXjYZ1f&NNN{A5R{jGD(T6^EU&%WRJzB}$W?zrdvk&$1*$Yl2U z&i8$v=Sc}Zp&N$6E@;2JXv3y$&-Y2JV!XxZ;5F-%Li}5VV02qJPYd-`gH9Ai&m8)N zis?$q*lV=^D%+>q!xiqPAA=12oY@B}pR&*}ILy>E*XaUrbj8nF0y@29m!vJ}7}n{A zp>-9!jb+v6%&T*^0{FaL0!UHUo9Z8Q4b7f5OnPHv%YlC(G!g<0EgADFx1%htPfpHs z8whBkRJ6n~uJy&~J5?6LO?H_Jutp%5r&2MNTAUn${ z0^LKNnnzE9BQPxP@9vS?smY}7*d~cWP_|&Z$x|XHp8Cf_6~|cOE36CkBLNWAf&G~B3fa`I4Zmjz8&Y#0 zj|QCosAo|=H{dy40;3>93jJ|8pa!dzHQm=3Z?8)u(-2e7nh3-|5lnIML+bLA4RPg# zK?2bX!imskDBmO3???-G-y_FMgt>ZZE*IrFoG6}A=^sz=O}(NfTEig?e_)QzDH&X( ze(=mYfiU%OqjuRaJjf8S@+_&eGPuINb315Hk$n`2(M!){I!;h5pjb$Fa(@k-FU)wmX zj8fgDZ*kZY@afvK`EN#@XC@rCYw2b`vTHL9K2lq15oRQmo)uJ?qJ`n~TsO~IbJfef zy&}<9(T#-x3g=%4fsw@ZES8i*5DPQbPGuz#?R_O!0Xr#wXw}vL}#HagSv9*7-_y5VpLW@ z6-p!Vy0CIR|Ztttxl?XNWOiMHN7amoe|;$0eLog`K?Q`ft})GyIA ziEHBzRr~=iG#%ZrDlcEj*Uh2MGKPMB;yN2gD$jiDms1t(5jt1?jhtl~ifydjN`T~l z_qkzLZ3dJ4*zsUT=#uWa+lXqfl7RIti_2Q(U0+726tq^^x;WV}xl*E!;*-MT#Py}KndZYnwUM`4tu6RyO zqq8>j1m-f21oTR7`K3U;0uX7|ZiVlzrn*)Aag(ELzECczV< ztN6PGw@JEQ@h;K9OHvDy=4)ouxiXzxyPC;prbS$1$dY&|iI1J~l$>JLP^u`^nS~9j zhF6rhnd2{oQ^7uLQu8kl$#&`UlKLzso#;`FWQAw5<`4Q>9g8xf%`wqY{@VL;nOk>U zoW2d7vWiSTllQ=DGT6rG!Jrrg{pN~4qWt>c~ zKK@wfd!omd5GVJ-<+t;31j}jjM(?!EG03`QQ2un8v-rW|f&!~9117-u+?yCOog3x6&et_d4VIW&Z=p6DG=q0}00DX{mx%rdbtzNmR#yT6n`s)sX!eUd6P#9(P zdvXFGs{WI$>)^>9EW`E#!W2{6M6D<}RqHqysX#r*N#Dp6Cum_hzvnc!W*J{Nn4G@# zwBt0}gj~3&`3Glc9`!APk1QRvK63m8N z01;V4_opDb$~hs|qLZOoWs`exdU10?!H&J3@MxowzF~Z4$4#XAHu7;! zUV)!om``IdIT&RkaaD;q1Yq$k{738k!Ct1Nu-*x~EC|>N!pjV#u1C+Q$Kj-EN)Zwj zjIyp>a0nv&WL@>py1H>nxPPP7DcX#ZsQ;n^mk(b5<+^=$|BQ=>;T$mv2-c&M{9GIv zG9&6DaH#FjSU}}$D8UcSQ{ zD|3xbghA-k9b>4{jlgJ)cud+vP)n9}`WzAVEx4s;bVt-bOq;y^y~B=PSu;|<6!SI} z$;SQI;D5#fLjz1V`{$PS0L~P2JXm-4*_toH5WU(WgMID{F?aA$d-%ORDC#1?UCycT zNQ$kWm>W(^KKatV2J@o1$Zw3Zyf2uNVWhMEzTDn{Sra)VXriR*PGIFnlZ=2=QD#^0 zN!D(Pdd8GP?VB@Xxut!uWUyC{TFYjd_xSSq^fpWx`oxP24Rg&=mKVEJMuY_3GApr} zCrlXmZyS7|xileENns||!r;Bvc$9lRz&hsw8yoLb{oe5+aYXxEfvnuKtf0u9YBGe| zixBSs@j|_KGI{)P!;SA7A@kPEoew8CWfr*(ojw_?wdnz5Gq8KsN>@W-x9!8l8ByKj zgTZGzoW6ok9RvQlq*X9(v$ns)8veA!YZ102lj_`isBM;`grezUF)zTejimI>R?c+tF?hf;|e5vgrzP}dRXNo6D%#3?29S}wk6$IjB zVa+s3Z}C)T?+ZVkVaI75DD>z?V<_s09t!4BwoHdTb}Z>K*Y0zq`Micf0rJ|Ch?+Vr zr#?N=Bh?nwoDqWON@Wo!dQcl}H!T;=*qF;~9~51cK90~KHT!;|u7qD6(myI-zY1pY zHq&fJGs$PooCq#gl&%y{cMKbw_ot>QHyIf|6kE}^raGD74bC&~jy_-nYvwA^kk3ws z34k%wSJgEWd3SMUWBd0Xy^0FvyjK1nhx}P`S+8K3g|u510p(~he&Zl#!hFZrzxoD7 z8DG-lt|&MKbIQ{3TK30#8G+(f9}HG7)lqr;45-DZWADB>>?%Po%_CGaX<@V>YV-T8 z>kc9p@19_b=qVf9)ae+E-n&G5_=IW0K%(Ir?Wu4@%WCQX1|6k_X)S`t^wGaE-@Cme z-05kUfVF?%GD$uk$af2FLcfb+B$7Fypg5KgQpgfYEwQM|+41Cg$4*Zj45|x`_V#qgYn!+sN18XV6BYxFO*IfyZ9=^ zK*^ZVQaOcw^btr9=c&vaEv1Za((x!*ol&Ftl=(S#Gp`@Vc$EnFkMTFM7t%ZxMbxz}q=PrUvCedXDc za{OE4Xf7sa4hm!sJi}qs-pz#$@OFq3Uo?S9`sa1m_6ylK^n`uH-qH?Zs&7@OfKceUKWbN()m4JrMVzb%c9 zA>jm=@Ud-At>2jeKnUq@a?JSS$vi%I(7w{F7l84~l=gC>M(is2Usu(&U7^D-|2 zHor=pAr~)iy@v)!=sY<1+(>$a)7$;8^+L=M2r#j{H2y_sA&4bLFlln1lH~9mgR_DCLt@n#Bd~cA{X>aIi z-iLUy^0{ro)DjouByPc~boB_pwz zDZ>aYhiBUd3)~!{NNvt`HNN?fKr%MA-#&c#`dj$-y z+{&cnw&|d@Oml-s?ROFkrA4DUT#9eLt7sp`oU*9XsR39^6Ls+*9YO|>^jC$uOr zLq>|IK8<9w#I*A=jd7JcXjs=QZuDb>a_vbs{QW(A&i(U^H#ZII-J~^w;SQxSk4k%> zbSy-k*oRB+0ffw}Y!9YD8=+<7{X5u}SS^@THY$Afe=_j0fKCnZ&b4AM8f?JG587@y1a>558|ma zFr7}v%mh^}PUS}4<9+-tUdD?zUY3JndDCT1@Oz01y{t+PI&;qajyJY{yXtmr<7S=X zOlj|`iIm+;X@U4;j)$7#qpAffSPS(%y*Ba2S!h86W;A~gvxH7Wdgeuyet?&evsPJ0 zXo_(LvQUxpI_+VB?N{p>#cd!DB4HWCTSlHW?cC%6xhT`qUnuh*@7-bs9At0kyOGcY z38ztg`6npGmoJ2_jkc^fuMxAynM2EVfRZiVf>SOxth z3Wkp?QOcUfcQnM~tP_3>5*|N5m+d;&qu?9x#>R(X@9cAb5o7F-)4q9%8}k0qi(GKi!yx`Vo0lM`y0*}m23CEs}v@6`HU!|+tGnTNiaDDmURrKNU^!#`x1x5NXP z;vp^x>$XBS5W}p-gZ^!$Gx;rF`~QSj{Eyz1`hnkDs1WF&xKqZ(MhU@w9-JI=Vsaj7`0Z2ohyO@J^4NEJYQPCeEVAxDmQ;gc);PDQ**^nH| zH03TlueHr zdRhk|D4w=B2DA-GT6MAf1zu%-fj}gQbjR$#LjU+KYgzmu!Ql7m701(C@x&8Dwj=U^+SYk9!_C)8@3FqB1Xlo-8d6cspH_t*Q%`P zgLjpMiO)AMh6j{pW1$O8=DHR&8F2?-U=6OKRX$KdpZU+<)`1(~vlU@lCYM1qjuKmPYH^fvDh5v-os_Mb^+dS4e z11qaL{AD=zdBw1i#KY6&d7|)<_D=-IX~^eUbEVcJR>t?U7VN%!ox9R^zSZCp|D!{) zj!h->G`zzOH_v*oevWca{l|=}f!$nq(}!+q(}MbbmOKle`e*rdz%IvLK*5P;8x_uK zrw?OD$plVQ+Obk0RA=tH!tB=>gcCmZYqP}UA5s#Un?_=$KR&8@C`UbZU1(xuMiRgC zE;ZFlQG{8efj)VrKn{kraFt>OZjq6@DV<)aCgEbWAZ1Pb4RD_J@T#V0XP&6?)Jb@EnqSQRep#ve#fysU5*_!!zcVl6QF4qvy``io zuPlR{%SChD{a1sFu&EcHEjb){Qh#{;;H`&58GbeIeEZeN;M)-mO5B)0YakUYx?Eqe zz-gJ_oS2(kGFg&&6ji9qbxwWPR`96R+R;1taU?0iX&~=g^zY}VnH_aK58dY>zmu4= zx;*jA`f$m!``Xn<-T95L>)la4_wC%Hjv%eTxHD7tf?uxaCWsro*acgg_`+ZkW|~#! zY+?o7U&qd}9g>>>^4+|_`$67me73D4*_i@eeOgB++kqcl8m`>VhWf)$ePUp4P2TV;{OlBUNU3u`E zo0q}v8;Si6=GXnnIWclGvq1G-Y{}WN5R?i|Ln+N`QmVVe`2;0|=N!I%NJvOYd4oI5d^E!JDmAi){`J%O;)Aa}U5C0QY3@6n1+ zzsNmnOVtVceNN7`hz5?_p5g^UaHhk_Op9V%O(T3%l4c0d6!vLGFu=Y1*Ero29u-_d z7raZqxA>gCnc4h+nV#_G`=C!WdQ1+OGtx0~V;Noj-lUOc_-elNA6=+*4(n^VD%Xr{!m0-Cioekaf^ z)HgKfu?#5W`eJ>CeX-TptG3~54o@N;+RO=!ApUF1aET^nd;D%Xyl~U!Db;0AkRx@v>a>xUC|CXQcUK6zXz5g*B|po zS>zLF(?uUhrN7H9`;+a4mM)~0@F4KQ+`B`*JD^ACSNlDk;^KLnKhmnepp{@+0{EIo(T+Yhqe*GZ=* z8z7Yjz6|VVOH_W*05sMAOQZ%UrR$7FGI*_&mPT(r$Ped){$%6d#zlr7r*^j2xLw?TOmM^Sn+`o=Z2cs;!W9qti2 zvl~h*&X)R6_^L?rU;!0gs!W(ktZka4PIRFe3WFW$63iP11qj1;-cl#3ky1=`Aft@R zx`g&AVD;757m1jM#s^LA_gu&YzfQk%&U)a9)CIsMbYprm&e8;aqbYu(IFVjuC1q1B zrbwDk;Q92;;q6PaDGmV=5QXu%fp0nwbSAfs$bCF&x#TW{KeaC+x~UEDmSqiBfF(m# z2Nal7{O^w7<1nb@lIq%QWM7@{R6hem2Q0bgHt=eaI`hJ@wBQeL2d4Ty$bO|EIfg>1 z@DVo$yEHya_fg%ws?$+z{%F3@n0SF%lHveZ+_#Agx$b0;51J5S8IuKxtGWEk;-{9A zweh6#u1$E!h`yO{VP@1O$?llt>2C4P@v9dsGhY^lKee){ix#c4>MCw749*H%)lpPj z-OxgQubSllIAk-einoHCnVcHN1WjYVF$zo>ZZz3;A{AUVDCsRF5Pv)S4nsmXy~Nu} ztDAl_sq)yng~5^@_-O_C^c+ct{F%=$VtULm-Co3_ET!=FpKKxqstB(ts&-m&=UfiY zWxX4Wd(^Hi8=7QBGdcE79woGyu01sA?v^NpJnKeqE__)p@ssW9nfI)(*>MrivFfr! z(t=N)lPaaU`o@jH+XcpFYj+ysC!F0xi;&EtI#3siOFtDDU+h{@(7rIMGxr3Q2NfXs zlPzWqR@gF8QSkC}rg-`&+RwkY`{^y;L}TFJ*5DJ`w0KZ2i5BIg;g zxiZ{HgV9X_ewq#15d~iSK(wkNRQU{r;PR90ypb3a>K&)_COhaZaB^J#!_51qmpi=d z6G1%*#n0_)GO`mRtCy;`dVQVG@;%RS$)n!G=Gr+!Lfg$s6NY$lO;s(n8uJ2{Br40- zExOHd?x_90lO+81kLS`KpM|0U7*2OPgbILc9|9rL%kO}9pJ_U9UpJz^*%^F|4Md86 z%P%!WJq0%Imw$oO{{*Z5$Gh@MmTg7-J$V$RMkJ$}yUI}C_4>S2q{WpFE<#l8*jXo& zh-<^!%~B_L7L&S0^!(jcuCj4^58L)re4hTxMgtuo=AuN^j-M;L7U2Z^-1YdE`J}xO zy%*Liho1vBh5x^9aoKCa^dHO+f2;94tO;6(&|wUhPctHJR}MeKz(g#gMi%zmpPwjv z9*S2wAsYGZ2rh_RmJ+hv1Oc2S@3va=7<#oo*~m-(T*_F( znV)P9pk?CRPd2v8nXj!`;(DZw1KwONfc|9~3#=*=re;t(aZg$w0PjUK`m)qe!zOz@ zKiMn*!a>HNwWi)Y>M)TPxrCs4uy`mqMgxdc&>{t(1%J#AG9{;wv;dzt(75GZ5TIiG ziPwGMzt|M3|7ZzYsQQJHf2=|>!*e4Vw`~9i0Ep~?M5eP-e)3KlD~AQ59-a(N|Hm5m z|5Hz_Oba5*^R_pDi11UXzW&mG>dS(E>Ib`}f`j`2m;;&2WTU&dTmEAer2nBCutw6W ziU)c?IE?*&+gJ=LGCFD9zcC^X3Q7QkH~hkGyS9rBWYU)$FA5^5W|`;7cjUSS>)v+)x1EF zAU-vCu-{#iUsw5~uVaLMC*uckTj^YNebfIL(N`kP&g9$z7IWMeq6+dw*mG7(7Uah< zAg~C0mo?E(q}mdH$Qc}Iiv|H=33sI-ABo`cf45QEoTTpkQs!_KC7|h!3_51ub=jeM zXJd6xj_vl8cAxXiqXgJ5P7%*OvxL6<2AFHna;Y49vcGRZ2*f7{sWFYH%wE_c!&SnR zaCz`2+a17jfyOs5+YeBmq>rMzMoPceCxOVmuf9)#?rZ^t9@-0b3I7An*LinA@5Jwq zY(ASTK$Z8s7g-_5xdNuL6>eSvbWp>B*=x}*waB2f%&pU0HcZ@#vn(G^(8mUu+W<|G z3B&3D^W-PnWe{zcC1e*z3vZ77$(EP8KUt!*=Ex${|76R}V*pE!15{gqTr6Sfg4#X| zn@m)Kwl*Q5JhopkfBU&05(ZRy(30tojI_;9M!O;x=UeEf$||9MRqD*&msn;b?eYhX zwkK@u64>=$R>|N$YV`GSMJJk4miJ>B5c5l>7W`GH5=t;EQ~(eUk>CCJ-8mjI1qN*a zzAiuk$K-F#v~@hQM^|Kpn{C|dZ4}1+)tKbJmH45?YG=)o$;_N-PY+c6yT(ZWtwdYT zg4M5iKYpk;M=Pz}+}*rB2}`hiBA&NwO7Gf^XC0_BY;5d&`D`2OK}~_za1VX2<2C@^ zu1M*>o{WsteXW1w%?SUCze>%NY=N3oV#B}Aq#%h!K+hZe^%NI(x!H0733uQ>sB8ut z&NwrcVA!8eLPCO}A$k2QYL)!HTL_Ta7@o;I^VgG-(i!>===A~VzS*BOwfghH#>R@W zg4Eb=`6Jn{rm1jY5ngase z(wI{-T;rG`-je0L^=cAKcjdrr?bw-xk9IFbeuUo&o~h{;bNO$x8j(p(o>H7eKi9WJ=0hR1dC{7Q9%gl+dQ+T45xBw3$`^lE zv|vi}@Am`lUa@0)eq5&6sog*#vnxy4+YtnmF1A8=Y_8Sl>>$l+$ zMN-s5=`+Cfcm}A$=GInOP$PDp$5c9eaGxnJGl1SfbzT{-&d z!qb(=Ah|f>HG0uOd?G6VXb7*Dz*NhB@=xO8s9}HXWWh!M|F-hqdH4Kpa!CByOk+BQ z;IBB*w{*Gl-$*_orvY9FH8Mc8<>i~&jGXJ*2Le9h3;$$rHWR7un@(UQa3oD^R|xO6 z#L9sH=b!u$z4*tSJhIj@UHWy^k&%80sTw`Ydps9Bi>Czlxjg)z3m;y%^COcxslfN* z9QNL%iG0|h{$MNx*ni}pHhR^Y=TfbiCSE^8z9QeGUO&)7_gfN($q^w>l@1?wx^Gyh zT$7MHNdXFkZm-v!hwznaD`A-t9)NaO-ay$gY&PpkHNeDVxiA(1Vb4YOp{Y4GZE=Lx&-Dt}=erNb#$MLR+&OjfH+q%QM?iA5z|;x-LF0Y4 zqtsy__Uh8WpwNz&lM)1z%sI7nNm6l6I0hlji#t;<%(N_c&f*Tz#irf3?wL zU-?>W37Pc5T2Jrw-NP%=amcEqXS6{F{EoCl_#oKj+^A-{vRgofXRg?&LeD@6u$)6rCYv(ek;}M)I*4o-X+CJk9bTyWd+!jFsEYM+(xcY7BnK`2r3A5O zwx=b#FGE*IN$qXA7CH_4Hwb4{L(!qvanWnd8yw$em_E4KPG(MKNBQ(lgPndJS(+($ zn5^DDz}}^MN8}t-N{z~$i=8Wdce2f*D4$b1&%72seCV2v&M)6|$)+M^*^A$t%W4iH za9--Mj*AIQr?(6W;$E;Dw8Sf`CHo0^AIGIuD?b0N@cpktMexYXJzdQUH{*YOkYm<+ zQfS+Wm(4rNrBt4RZOapLn(2dbCuH&&zLf(QmY)d9N0p?Bi``dh7W~XO?DqxKHaJP2 zm~}}GD1j@^`e0@$2K3pPJ5!z^zERr@AH~yW(?=vt4KH!LtrTlZf}`A$+l+egNu{b2 z7L7|3D5kL`BhadMT1%vP1L*{+H@KgQn$7bX1E=X8`^Vqu~j3;*psMbPNgsq={^ zz6{5mLrA8Msf?>fgexTauP*QC{Z<<;^~?A=QfII(nWcbKsS4iO@Qd=*y_wcrHRB#d z=SY2D@hW4La^p4*h*T$j8-3R!KL*N5$j6B(ZW`R7u~SGibAw|DP1^U3M5ZCE0JuVN zYa)dh#Yj#^M&KsY>9tMIlQ7g*mzZ@Y3;%>4UPYQuDwAj?GN-~o`~Hl%_HgBc^qo~+ zfmI5LTk&>km)v+_wTsi&JK3MP%f7W^p@f6C*AyH$x?C@?``^Cf1_i{jqM6n@k@KTJ z**wZ}j4cnpfbeLI$C6@`quT_}sPuU&0Ox}93#PN2N zmnVy_@Z`Vy%=Pt)U)riU6}eWOkGM?LMw1c`)5DvGm|En+vff!1c?IwXgznoHPA3`a zpMC!#GlUIQck1aOa&;1jQ^?~Y#vLG4m>*A`ZeIH?q0?yo5!(oLAcpN3DOS*{cbzAi zVfo4Oj8+4HSB`UV_E>r_tsO#hCPucLb(Whr0nImh--RYMu14039Yp&aA=ZY&nSe%bbEu-A$%~%E?0DTBh%*N$mwB(hGb+Sp+3b&=Bc-V z>*Hica=%m}ZNN6(qO2^9|fUCyiONeVd%zAb$i|idAO7-oSh_A3$NPi!@ z#=LxbR0ZEZ3DXYHSh(8aUzb=_Fo59weW5#1pM6eU94_EQJ&1mau=VgGOKQ)Vn4v6I zO`rF6`nYm5w?i`q-5>Zz$XCI){Nsjk028HDuH-fKUW46mB#w zjP8X1$7;XDOCTuE_P^nEI2buE!G2K9fMRasU{$db-CWUlfu z;Gg)vW-Z?{{x{Z03)6?eMQ>Bm17B&Z9r`_?P?n7%dBIXDw}fFN_*uxYSIF~qf%1Oc z`7P6xfjl(QCHV9&EiV@IC;qhxD6``LwX4%gvA*bqD4sz^{aTY#00ahh2B~oedKFyY z4k&jV3doV0{K-Zs+464vqnaN*JMKQMPES{L&+SDA{o0L7hhtJc5r%m07%d!0Uf9I-QEJdoV`2& z-nFv)Am{WP)%h;!gu@SoNwqYt{%qH@xuDn%qc#lPH;fhBS3nQ=0| z!fW>=b%TA;3O2B+B1{M0)K!UfGj7u2W4>)>-Z9Pi+OKK>wPrUk7yD9P-0~4y?G<>CmXg%yJdb18@@F$9hV_xcabPKd!5UBaEh0qgpAf#-&bA%@vqI{wSWlC(k-tn$>?}BrWwq=n33#M zm!ap8=ySi{%j3w%ncSUkk;><;FPwj~t!u*M?`{jkaRY>lLZeN-G!d7Pa;9WCoc+34 zea%W1g?456&`|7FO-Xoz3%9bOPpCIJ zTer;ohTy312kT~f^(`}J32?lxM_;JC0?LH0e$b=|AuJlxTpeBDhwUcxg@s&dZOm z5m$^-DW}{|yr5;4sBfv&5d{xy%Wy94i%ihi$s|%O26^F`7BoesT(~9>^@`I%ir}J) z#xS8j)@1AJ!}ys*$8$+DBg$~>r4usU{ADupM^kc*DJ;G40V}3EO*od!tGHFf`o>s;oS%Tpju&W=42O(zW;`Im+glb*fNR5UU*Dl2Pj4*YJ1&AdD{ zLZ8alEXJ2?ARITQEQor+ggxg|u?I~xFiX15FiU%BTsRB&;z5?kxO+7CMSI~SC$1Xe zQn(_n9D};ibJpG6K_>RK(|SY>?J#|9R26}I4+pmza7J|M&gUw`x9&--i1&GEi)Xye z;C)YQsy@iIOBx@aw7vPU`_Z7DCXmJCfp(#Rp6`f-AM-Yl;-6v++J*5r>zk4dPw_$1 zM7e^Sw1-qYtFU{63T$sRUS?QR&JN+gtjXr8ks@8W zy?&j*32tA3X+!yjYi#hhcSj6N)>%jk#-;t=kZqHrEO{XI>t+VH6F4?Hs^Ou#)(7u) z)YZO>uMXG}8c*z7e0uF$pF`AUX9u?RBkMzI2tJ_(_(b;*dErZG-5*w6??s);)@(V-*G|eDF|wxLNv&npuG03i%C;GlP@jrM-DJn`FLYdUC~SXl zs|4$Tc7QLg0avJ_$HrSgh-0+DMBK*~p=Axm?Owfte4UQR6NDp?lHaj3nVyo)gIKMG z_ZlU8)(Sn;Q(gHtq}gz@rGe67Z-F2ZhT&caL}RTTi;G&r%032=*9{&guMZ%uC zI%yu51yxa&FRUa^IXm3|7Sp-|>4Ne#4&C)f)5wnGXTn4gq(`C|X)y*v3AKv02eJ{W ze6?`f_LxgkcdY~V>+HUo*ZH=6l9}$##C|VrKHm9wx@LDhElhjNaj#5o(s8`E+~cy$ zNJH4RFBF4rM3v`e0MmnsCxeouCG|D-z2I3yb81i|X27nUWS3mNA|;Yd=AK4JZ~ws6 z?4+kqd@Qmks{N&c9GnhqqQ-`w-<>pAPuah>%sMmX%Tj0f8Z*+#P^aYQA;`psqI4Q-vGq-LrU`+yL)WT(no~@#*$`qke-X>pAxWPD6~k#ZzM;sd;u*_OVdQ;Zg5x4RjiDYuUY;Tq?HL8AoXm@!(exGh+FRL`U{ztB zQ#|#wzjx?|hmYWT-^msUQZhps^AQk6bfSSe#lh{)9Nhei=6KllMFSbRhT`P+kejEI z`Z~<~JYZ6>nijMlD}#?*Pxw7ukmnB*pz_imN6&i0<5m_s4HRj(7^Xvz^w3RjR^sri{MytCp<=v3YNt1$!*Q)9ZEa8JfUzQj=$O_-2TnG)h!uo&cNhzlj@IgoDN)%jE<}&40pYaQbUj8X7dex9kI5g&f|Fe=V+Ij5P7^>szUk} z$f|O*!tlZvs-gg={oE8LB^dog!X_Qj<0nvaPi|XUIJ_f-Jw{*QVY$8$8E|+(wP#eC zXu0WRZZ+~(Z(X%_{`lZ7K23fnfTq?@-&i@u{c7r|=PMO8OpX1+aEM`AI~LmjWF}!Y z_&on03xBb>>pZH6*$;}*x>7PwqU@}4%Y-c!=5Aw8AxDCHk`HhAv_+Jx&3;%Jc^fqSq}6uX6$&7#=!jKwr%<1yfD+{1)7{Ofx%Y-Fyji;K;l}D@kM?B7+VsqYJ!RejSpl44qVwyKd*?MQ*~> z)ucqK$K42)00aFgYdrG_8o0+jUE3-1 zykFm7YJt*5`}saW1_cJXFQ$h2Dcs6GtnyT0`a`Wc&RtA}r8NWZYnSG03Y+~sVBjjz zW`YSSQcE{TCrkWZ5GNqlw%JQ23&@>p7dXi9yige>`m!bxpCO&A1U2_xJGN1NxZ(%97+*9rYbjv zxVonm`4&IZp*x@wh`j&{Xu5bm_Ot(QU}#MW6?X_Qjq`PJo!q{kc5`K^NAn_>A~bb# zToZNY2TgivM>C^KU3)=q%Ba@#Bl$iprnO@P+z`WX}`*{Zv-L986?L&ik?$$LP zXBfU&|6p+Gps74unKeK+F(2M3yKL4;4?$*bu6~xkKKH?N^D zPfz#x@V>6N@3u)X!i%lBbEM>BEi)Sez0Yp9l=iGNj}|~{o!R^B1hOapkM^$qo$0-g z>p9_gNS2(a5JF0s`^Ynq94#qCtPUmZpyXl9Jlrx5VYM(4OP&dtZNzM8Sb3glvSn;e z@@#XM#jN{#-`D-a`QcpG{SVx~ey{I!eXr~LeP5sV>-&B^ylXi@4df{i#>K~AKKeL^ z;7)_t5F4^BwfXuKO^KB_;noz=gO>2qD*7MF-4TV8-v{ps6SUsf3RsX_GDPWNr5z zFLK(7di8N%j{c};V(6c!iE@I?ShOu*p6WX6(DjB3Q>dErS85boZ6r75s|^hMRtG$_ z%`|`Ev*gyhOF)^kb5I!c=#GG!H0f#4kRmxZ*{|0T>tCnWm7pXB`7-KW z2Vit#nCFvwJ`FC*_cRf<9WHnLjBoOS5@{E&?oN(WYl_}lM`Y0mgID0lkx2-ie zayQX*>-oW#g(}8{7Z$%N>PBOV!>SWH9OE3yDsa4y@juVf`48dWtu^oYoPfUoqROxP zyOs9W`uaJ?hwQ|#Ee(E}23Mc>j^XRweeW`tpak5(5JG^*5|AF<{)TvA*grMdf4T|t za#(_ULle%Std;TK^9(|u0~s#E7b;K}(h4YkJ((@m>RU-I|2>_)9}9JFaVps0oGb-7OqMgu~6;Xw;in|CDs&0ED}(>Uiz^j;WMiE>0t z^<qTStQ4Vnow!W}3rtcSHQNm1q$IYRY)4PCX`6ma=_TYmcR$aE}l3 zWTe3oMF*Y~=TcohlE&z`Z)CJ!Z+}4bb^Ns)XL;|XpmT5R(PvYovda}?@PEvz;gl&l zpGjE0i^QGhJ0EkF*ebZzw;ax---)N;;eozwX=5g=WkbCiHE-fZEQ}AO0I7MHZ_Qg| zF7PexGMh~Qz!9e*u7ik$i8e%pOKAH%$EiNMK@_|7$}B8%1DX|4=Ru1CHvA+D);%o1 zO=ah6iAzNyED^OdK1p8D#<<4ZYI(E_3yjq5$XxtRabhF{YoQOVcQho$b~jYqy$nzG z6Vt1LNi2YOImw-XCff0TW=~vTDScOKbd^7{D;qcuO4HVBx`6PC!HFhT(Wdpx^Y?bO zu;SyRmTpy~hWhyp<~ufu81-AWveB!(B}rhK{OJ=8s&{Kucn>k~Fj?ulRz1|oIBUFk zkZwUL;3*z*n?mmRl^pU*$SNYelXCVE~b}ZE_+(KCSI#BtyDMBb8BB* zA`XVO&cjw`icvXBWq*jiR*{$W%``Z!dLcx&I-fR6DjmS)Y1YaT^AS*YEGWtHs8G>O z$ceLQX=KGAG;us%M8_@7ijz9PZig(^=g++w+l~4vg4K>HPutBT?6aACRje#d*#zo= z&m4Sp53Hrwwcx{syZR+}s_p;c(}~A>`zNVJ8y+Jg)bq3pz^&aq9T8;b&7JTt&rfmJ zYG)}rLM%!G;X@AUWg8R6!3c+#mvh>#$rr=$WvmrjhSiH*htB0!Ub*wM<=7dmaNPC~ z$$5bqFbn-5leM;p02IGX0S_zYT2Tb!5EG)l9#{RwtiY#B{VFnJh^`@16AnG;=bS2v z&WI+&ZqFZS2-w#`dTzzd7lS`ULntSCo)XeshT7jWZzOW7|qKPYcq!Gz!J`P1u z5Kz%X^xipZJwYb87+mPVG)cieX+Gum;Ad<{3BAh-!BT^f$hJYX*J_?o%zNe=$iB;F?L<1eJlhp?HzOAn zY4qz*BI*)mP%6tS5qsDUPYF`9RyiTCI2o&GIhdB}w6OrS|2AO*iorbt#Rj2rNONZio5!4Uk8rJDON^C79`1T?+!cy{o-{ zYkX`BTkNvfSzwdzIjjRt2MHECJrYa}8Tc7#5>h=~klC~Xg zSl0G>Dk*BaG@1k;&l(mLMA45s2lSG1@otWj@KY{v#HTr35^=VSrHkl&>|5xzr>E)d z%xo050|@5v#b=j_f5`N( zB0(b!ues;iep%Gqai5Vh9(p^|wlHw#2WT{4JxqQegp1=xJ8e|skIiXn4f7h^yd3UE z+{O#9vYr|BK7jXDrcXWn!|^03oZ}QFqilC%6)J}Wu@TM0uOZK7ds*w0ypir#ML5Hm zMeaI~WQbg4Twf|9Qa3HV#q~^nb2nY6%(|3ollk%)Eg>YAt9)xKwS4#Hso(6oL?w|= zS~P>6KWHJw62qn2!~uZ40hBKB1L%nN4*V>bRAt=V41&Mc4Ez=o8By$xFcCtBZJDq5 zbUNo_U(?00?{6$JrfSVj`bK1WjjK|&%#i*S80^_Xfab$1{l$LvcUw^Z*R^eb^?*<( zYY|kQJA8kr`M-5}nX6hee?y5T#w&_J;aDxe10pFEQ-{J@e#lsQ%^rlL$2zb5qT4tP z?y{z-j~_`%{EoH0O$(^v4E$s9bCml>2tmcPei(&JJfocR=;q<1J1MI*DstyC<@7}!&5O(jLJ;0}ff&YW{ zaP2)JcJ|UfZlk-b$32gpd;C0Wzxd^{W**~yvV_9DhfmlJ@bd8s2uhxiI(h1}qLQ-8 z`3tIASG09>uj*Yhxn*i*ZeeL<@8IaYT0a`W=v6%>|NR901^YijFSTHD$?IzM)G4-5_skBojD!xD(3Z__ig-{v-^%*GGe{!$$k9X zUPtP)fdzf^DYIH4%k49X%N|Bsy@Wj1{tC7i9e-s?NpvL4i zSYc4Ac0f(mJD_M(YuUK=)7;1cHWi-})r);rnY=k~)70Fgqjo@HNkKaxbtqybWd}rj z_ow5c^lj&6KZGa3xY&2doO=hveqw{^kKF;`Wp_aBMt?qLR!r4nYBX~#mfn?0{ZWMM zKOO#Z-3P(f%5X-v4H+`&_)U`g4hW9k0rBYm>2Ry>$ue_l>xF&w+ZrUzQU$ZtG0NP8 zF;6G_;b0xPcVfGF{d6Z(+Y>@AhaqO;P}{3`hAH?D2Me0)_4Lqr(|Bw&5kYX6+yV6o z+0mylv_i-qk4E5pejBVqMIu!^Z9AZruErfurZQ%u2SK@o_~TJAO>SkGv%u`1P$-~a zOR^1q9Q<#E{#&8{e_H5`g8x5VUcO-XF9Zn4|G03HVe;?z{JWg{?}YaoqWE{h`yYlN zCdPI^o#S>Zs5KN4F;#?=ZvpRO;2^{bbPt#SzJozokR#%j*AtFdS$B!lSPCT;dVP=@ z#WrL!4^(=QLq8x-m+gR_4&Xpr+u>Unt*KAJ>NWy5Qo79;hYp%vF!6mpbEX(^FU(;r zI|8;$iaqT}TDUE(sH9l5VwPMs7^G=OW<_wIn2jT;Q;CLzOho#71aH#CGU zEr=v-ple1mDzaiTBen4cLK!K3AwlY~3F0C1-dv|2b2}`5)_$7z^i zf4k<8BQ$NwK2nRBN`L$Lpm#?`uokT+=0t;1Twm`EW4V*f)~xhh)tPbBYihEDtkn+Y z5~DbFGLAD@F{;i{q6XYX(e#ToM`Z4&`pSap(O3&!*W;$9Jx7l6f&~~BJD?}-a5G96 zvJG?8ie~E`XMdeGC)I}G^oRSS>4#uEb3351GHZU~kj(U&j0d}bI@-yg7^%!tVOutZ z3DrDL_FG(_)LW48i%Z3Gn8WJ92UR)po|7Qa21I(o;Sb0Cjc2x(muH@^`UP-=S^GBGxG}3YsD5Iidcaj+OTvwwiw{q|j?5;v`xOwfZGh)xePYGR>@G)~Vep3Z6 zq9Ca|AX+X7fkSrefOazvFMwGZq>1vo=cp&x4Wqax)BE`CY;@3SGWV)dln-mUNxDiH zsYTq{r=+{KH-RPzUWAZVXeaP7>IUS|n{f@$DG}!zgX{GW;mVYL8{K#9P@de5RCOK0 zO7)Xs=GD;HvNrhJO`}X0^FRju94(vrp_bwoS_*NnV`E%Szd3NHoSfg5O9@9hdgXMl zKCk=UC2T%I!KMU!Qr-c%>b*alFnL}(w0Zi6m%OvUsln+1gN{+C+t6#X^oQt>cMl3K z7<;^(_OroH`#IIiDr=;Zq!>ppb3Q>-^|gYZZgocZ%=yUkx}fVyt2CbzdhIO2d*52{ zo?o(^9NPTu_+q1*n@h%hX8)&{cw8G8J=FJ#LAYi58>YZry$kXF<=`A`%cz32}%DdJ90-&j30lO{%hgz+{V9}GF^ zPn_*YlaH}$ujciwupYl{J*k8md%a1Vb9j80WmpV4aN*VElPOur(^VPg3#0tt{pQ!Q z4aVjhdzA3Gi|slOXDXLpkU~nNgwP??iTd^n^0*}Cfh;nH3i;Atnbk{Nl4tTdr4!ss z5C;9zgDdjK;+{HKrH>smNa^oUyBzvCMRw8+^sw6v9R`^yL>_{((&ZT<6zBGYBd$y^ z#kp;T)r$7|`D?rbh=1joWX6YMA4->&vvKAGd<;C;2TG36CUZu?H3$jO-2N(N2y!b#Z$0iz~fC7@z7F%%ho^)FszC;e}h}u5PIO7sMn?T0Pnzp|VL5 zh?cq`Yz#4S=M$fjAmYAMSPny{GIOJq&+N->+s=}lv)OeY?!;|$Ux_T>+v*Z|a=e03 zHM0Y%WM%N+2rHo&`|nI?xMocgr9EQ@6j{PJ>-PS;U{Y`j1$7UdAxAjORx+vN>lkku zmn(KeqeHuo`wg>AQ-+KOobM~f?2D!_DwLr>ZfBST6En`jZ(}zY;^*9a4ayb#ycazE zdp*UU^cRImOf4ShjHGqa_cClpm>}jr%9i}ol9h%_M8h~UTL`%+T^Z%>p{`{QJ&|!@ z4{l6$jM;Zm)OX;(>KPq>@}{qGVT(f2RaNGa zUTL3qyuExCd!mQvaAetXNbcx3ur-_H@;dXCD_SCo-S^d@~O# zKxlx+;3sMBMDS5JU5^Yxqw?&nx(mCxE^%LDWU_YWm51=V1+KJXLIssp;u@rbr@)8Z z%(~?A-?W#Me5$)WwRX6n($R9Cj+U6vV}ac-1nepknorPB^ppN{0yABs&C5T%H83Rs zD%-Z=bzILAcKVd_ix_2r&Pk8g4lJFYhVySIy%s7ru1-nGEYe-I`l0r|>GRFdcN3Fa zmLVF3$7yPGuQA4T6~e=#Z-NunTcEbMQu0WkuXft&3RZ zes+obz3&xP+mb1|jHCB@+IK(zSLKAFnW@xqMm6lF^q3AWmR4O@@;E{~zqpw9a{r4o z<>*W5k|IvA&#O}1GTmDl9Qllkv{nLaOqUu>28Z6Ig%-jukf&##s+&*E!QKp1sa=>p zY>C%*m+ZQ_x4oEJQKT!bJ0ssM;PreSdALacZnK@OsT$IaJgl?>3a2tTkj;TJ=y(3v z*CN`gvH8?J+;ams+{(-SPX`pv?X%#$7}m6Qa>CBkWcQOeXJg+R>vBNaxS#hn+3$PW zi=`5@I#%g)cSc^-G$tKtvs7WIFNoQPn99rKBkzC~QE&WLh#PSY>>?{s4Z1;uZCN-t zZ-MVrp&`#=NP7A!hq%+Kmb$(SEH>- zMTX53DV22FwADeMzt|&|robNcVn93Xc&jVFv4Wi{gJnBhQ-#^H<@^C3>5DnEq;5y# z1W;YfqE7;=$it3FIvrv$EaN zeV<-i7x?uGNuPR{D}o!4RU4~Lnbj7!W-2N0y{cj*k7*W&Xhq(G^KIubxan7DLS__| zCq4lU+HYJoHmvTWsdYZ1&wZ52a4KUK9hxJL9~((xUdDEJ7q?#(RiH}&q8Ty3030Ns z+6?*J7v9mNTPOF8ROvep`DCyf56XxSF3E*_PVDmYI&jhBc5GE0CSBl89KYj*ImlGn zzAMvxH0~+HuZdQxdD6%`qhg@2Ejx1T@;0u1u?rh#KDSbMNRr z5Io75&c=91NnLEER7{0r0o$q9zeu1=cP2E55rY~-Mpg_cF(NK*Z25hz0&7cJ#|!zM zo#{Dp5vvmL;~WEnGt0d|FX&9U-9x}MP&YD)7hjA{I;y_VNb|Ism|OL=ja$c+c4EQh zJ0QkUp{X6vQc|&-AgmR`FIQGL=j*!_yA?c>9*}Fhok-xl>XFF)@m}Ip5u5!lc%DUZ z&uoUfhI|2&jS)}m%2(PH2!_J`^LYKytjYwVhU(B84H!YwqTZuyolwVeJo<7lCOKvAC zrAoBRxR@WOcmQlV|8$cb{ZdFPQ z+nuOZv0M|)BJGutA|sA^86bzV&sr+;UreI}77MTSPkVIV3|U`H)qFl2gx{3=*3o!F zPr2IFw%26*9J8yXbp@k+ZP z>m2*(tCprOUR{1>$O@p~=9`*(Xf_ED5`NePP+e8k%-siJ(DE4o9+pirpi%zk_S zJ+ZyD>dCk|(kDX+y+*IKgr$ug(4HPj#1iT*xrbmIkv#_F3ceOR+wC5AqQelkSxwT- z#I~_ZZ(CL|*qn0q-oZY>?L0+o`k46h?c5MC_>BPoL}9*iTa0LO#~4OgJ)m3{jCfMK z9<$#lP2=?WJi27dM{4u+OVi;h&sjFb{bD3XuPf`Pju_p1hlBSPwJRp38y0TVnyzmI zF2|i3N{7AjhLy%iER|x0(Yjx;c8sG*Q<)WXwRt-pG0HHCA!enVhm~Fbl%nEkYcOQ($3h(Ue|P zx;m2jtoMMv%aqQy^rvwbK}q2Pn-H_@M2stpW@^W!?vwMq4*!HlPYzB)D^AMjjm_J?+TVS+|kchW7SsR950mmNDUWWMl9XByW=d4c8&48!wynB}DkW9k)T@+(w!@ zR@wfDeEQyTqwBj1g!W$+o;H`+k76Yw89c{fIDKmMXb2Dd5Jfa$J0_SMz1FVk94S{R z)DvuCFp@TNvc&RD16PqXzlYc>tq)fo4~Hh7FIA&X00l}Q+?cjN@uH@TG(ZU3nydJB zUQsp-`I9*|tig9uqNab@p{BOXv!>Ge!!3?;g}gqS)#2iK{o=ILH_XYv)Fm~FIibPs zK$9rVZmNnI7kqS5qGEVOChy6X(A=Ib=nIzQ+W{da*949m&zzE2z11?k>2RxXFjc|R z_lA)#JgP*dHa*GJQd-HmHpk5@jyQm+clIbXs++*}6pe2MQAM}2T8>k+^Tx`XUm5$(xY=qW;8oP$0 zCHmx>UH=7d4panC>3;>9VTd2xwg{jey)Di>x&wObr*InR>^Q>`RRO{yZe#ZjsH8WL zwH31|yokU+MU66Rb6g)7 zJwVF6?uJ>L>}1km%o7PT6G0SX17MAsa66zV)XhH3oKEl#=o*A5>Im+UZ-D&!M*pR% zTP+R{Wuc0&#PMFgrZ2_t0@Y+eHWiVko%er=Y2Sm!J!5X&KVD?? z9bl)~zliu3Ee7-ZqQIO!i*+ z>pLU@C_>?1IPb6TZ1~Suq7eVnV*hz__}fYUedUYzm(2BF*xL}uUs2mnv0nTAVyi(v zlf*x1t3M6lFFM~(_x=~W;%{~U1eO2D#H;=mtM0jD$}>`<)lIV&uqg?IVBOo~!RuJf zY#+A@n>iha)fwg0N=M>3sczi<@dn{&>SVH0p(c3xreAa_bIa6eV>pBVA43HN`C(|~{dKgkFGzK_!UzmiA)t+)SJZ<#bZpvrl(FoO2dbDwU* zpD}l`&ph9qU`4^xPJgwd-4fk9UW}($Su-$`JD^KVBnHLKa57|`R&C6E9^6OKq&RsyPDbv>Z8;uX#l&L z8;K<(cXtNR2dfAB1`|H|8uiUhhujMp!KF`83tlTWnZO{ehp{*Mml0dDH0_X#Ozj6m zrnt*}^Gf0o1P-yie>8Ie%v&W3F{=*~t2lMAPcX%->p|4Y}6c$=t^LGFmAI zHDLw-JyJY?nu$e;Z!y3ir*%cb<_<`FWGe$at%|4J#^y6tfm#d$`*p@M{T2Y}%^({~ z0OBnC_AYzd<1=KI5jyXUNM1nvU#_39UVnZEgk0q;=x3Ug03}6lA)-$jOb3XZpOcxj zRfe0>0EiC(8g7rXY<3d7fGjd{b0S!h#{b+ zs$IAH$97~h`7{AKKpmh1e(K+JbDhXZlQnqql9x^PJ9k>K@>@ zxbECwVGnWTa_(|Bx9%k#zj8tChJulLYt+50Q#WkaO9~ep8kO9G>*D%bwJQgJDT8v@ z59hILlJYyqbll%eA>oe}Yd$*ysCRDx**1yNvT*UKzv%46LAWd5qvd8wRh@si{%D4* z)eQd1s(z27$k1a!vzmB==e@^Ux{GE4Qx{oDHqISZm`=yxb*PD{jW{u{B;SI)C;zpj zwS;o+u^3M^apO;y<&Jus7akhzJsC~ky3yAR;D^-B%Mr@wI*=3iWo0kqwK4h6kAn_ z;z$lxqsPdqE%pkNFA^S~n`jo_RJb2k27dLKCS*g|=m68CIpY+!?_Q>XKZpwT%l~*; z*%v8T^7?E{=TP^Aets)Vr0QG6OCDRbRG00gG_mpdTS-+~J&3Jx^E_NtV_aIAVX{bKo+ z`ks};6Z0v&dQ&Tr;%!zelIgMVR+rD$=K zCw(8@(~^kV)iI7)6Ob6*j!yHMhH~zznOybin_79tOj9g*C2J4x-4C(nF{{c0=-GST z+Waf@{??7-uJT%-5Xb~keXX5PR`yu@ER*=V?@uAH`v0`gO z_oIW_!QgbNzj<&e&go(9V?Ngn&pvcW3!WdyK`!8M+dY(yT*92Xv`S26`*8L^PA&aP z^@Cn+z5UOtrB)7J4@-r0e=?Uvdlnz^%+wXQp)`+XJ(*wVI`PA8ZgJ%4t^9}wzHu4p zR*Fq&f35a*Sz(nMsOx;VgjI?&Qv(~geT z`OJ=Q$?YRwd4~ z&s^;hzB~P##qUleo71t~wy>?{Og$a%1$3{}(K@`L9NJ7(vq)#|{02kT3;#2vzWSZz z=Kjh5LIPcYP;J?G+K|)#^L#L0v*vMFM8$V>=CMYyN_;j&F3$Dsyo&7ojUs>9yRsTZ z9Vw~{QzU7nFpW*{8&#r;^>a zD+F&k{^o6O;7-G=jPl=5g!v3#CyI881ozoa)KqiT1P?cy&7t8wsG21eb`~>KDWePt zD|>5OTN(FhH!dxxgx~2epUN-a<2R2At$7wk*QLhNHuIUikUc)~0&c#l;UyvwVBBYVJY)J>_p)PoyY~e>&>Xb!@j$bZ<=rhvc;q^G_3rb-~=$u%I{jx}3)F z_fbosf6g9xkm0{WBGQC8wTTu-*mk!j8%6>h7VFj>5LX^KZZ<|;F{Md9-Kbybq^vD} zseQ`g9L3-uxvEX(rq##T(s~ETnX8zoL^E57A9T**V?Ue0S9)R$I^z2YD=-hzvv6gGKz)iRdUz@Pg(! zG9pf{(j8#xkIs{6YFcHH!Rdz^hmIp<|Ra z2Bf}GQ<=5dH}yDvN#7q!9IKWU-OX>w@lF%|0^4a#613LV zjWhoHT$%h>%W+!is4?Z6;EfVbiGJC(lr5#?XM965@%uQU1cz;M;&@{CR_R3;Tx*Bs zneBX^m2mtaCRZ=l$396WrtJm7gjXBKDc~YJtr>wi)D^hmCz|C zbv;4PqSGZh*ET#(SsR4-nXLrNiFO`DN?YxK>}FRrKmOu`h(4iT^N9QOJnu)vCqK^L==!(jA9T`nfquQK6x}_810&-k{kEeaTgOeA#m%yj#KGo zt~sl~5P?I=zEDvs*bCC0&U*0$`OSRr#*rNm*0fqk^>aaYv8R&FkR#M=ZmdyFt@KmW z&9~zL=CIE7)$gu9;W}bA<8K%(`A_knM^uc~PqgNwokE6%h_)9%$sxI9yxHio_YSC{ z4c_xzNmg@z?wayu=zXv5dab=`<(H0ebuq_~WRo~fsuiu7^AXg6<_8Swp8GCK)UP1f ziD(go_Ew)$yxF>^Z_kRx5K6e--lFAnNBg(yZ#>jBy^uta^IwWi%%2!3a=`jE#aJ{o z)_wON*LZ(>9U^2mlVq2XQ2Dc3n#Zht{`VW6ABB7oD_fI&$xIOHUws5tP z+!v106t;pJ_WNjDCaAaxTJPhFk+^eD04l5_%qC%cLWd)?FP&D;WIyXj0On8SgyJ}X zxtlP!4H3nvORD{W5oTP8X!RYjf-kpxo{$qA(aGF$H16PeDiI{C-ui7#IX{8uI^>;o z!6pEuS?}#i4b-^4oyn84gkf;5*#&F?+!;IaXTRmQ;>?hCyY6?zn|Z4pXb0rxv<;*X z4^9^U(AKSlNLdCu3HBtrjasMitykEyM=lp+Df!su?b|?`k_q`EjUp{Wc~7ELb+Qn=LySfr@No@xW0t(Qmj^`%#GgT8PT*J z)xP1Y13pLvgDUS5r@?yMo6GT{x2f^ZtD6dC5p#OrYlxQVf0S{5#_ltnO9FIb|50iw zVr;UnSykh66reFtTB})qgKoY)seXlhJ|;NN%FW#?U(YYEStjbBmzDYx3#aWhEy1H~ z;;M9@*5BQUIih)(*<*DDvR@rY?E6>Zl?=J&R1duh@PqQ^NGRw}N9NG42De=1vC`S> zAddCf6giDe@Ll8aJan!=+I!H}y544G3|iRKy!c>wN%v|yde9?n{R>_E*NW)3ij*@J z`vz!a{RZ$Exa~U3R947YB-MrHSPYjK=?r6N6QSog1>B7d^4k5Ws<(`B*5g*?*W-jA zHV%I~^DVBm=VkmY(h$T0Lp!CNzbK1pNW(KuzpB(%(+|Ep)4f3yoNJP;LkGk@Y>ZDF zxgl5msGSvSza}6Oa@%1@;n4B)*i$1O#t-#u>?YipW|P<-$IrIvRrQn`Y}z?OSKJ}5 zsQC=JVDo>}`~|E)QG)3CtptaMxzc^yGL^Q=)`6M*CcZC>UBFC3kU~hNI3)+GSrrUZ z8aK=bexGTE2``~N8}T#8`%gzo4d`qpogpM z?d-#$Rx0)SHR_)my?oDUrQO~ zl~A)wRvfB^>os^L(*;)V+E%aN9g<*OmL>4MTHTJgTmR6qtA8iaBkK(!@@l3v)o90+2D_wj~wA{@$ig@=Dw8*0b|Vei-^as+#|FJ=@`nT*m^; zL~vg#a|#c~BYf}9m$9FK+!_FS zxGl5)h{DepPQz@!Lzbu)h^g0h!fDwxOPm|~SFi@0_WFEy=wy;8bb z(sWZSTupfz zWf@i+3RU%KY{7L^Us7BWNMw|gU4iEfb>Vm0hL4Ur%Rk&0_HNwvG4%L^ zbPh8zcGvv|%#3h;0Rt4o??B`)$n5vl`VB*qM92FeM47E2yd&ybMQ&Cjxk@voQcXi1 znKJ>r8pcb9731{}zbnj^di3Vd-aG#G%mb%N+?Yb-goKqQ;nurkSZCUFUPQKg4-u?l zWfJhPy4pO|3O1H<66%!kY**^T?jptO{c<+;9Tz5pRV#9DRCvhYa{YoNQ1!mP)@7ZX zT4Quw5lEK}()Euvk@QD!W=c+7lrMx|qE*rFG5jg4@%F1wxHvI|Jo#!LlC*6+-)a~K z&`Wnc>Wt7&x?0(=_THq=N3QjUeT@-=ZY&v4SX+=}vmz8LenHxk9KB#L_~X`K+|vWz z6Hd$6ndM2+5(|99(yW_!B(`0v(qg*E?NzmpU{lY693$E;&_Gtcw8?H(E>pyoJXW>g z^TP`1_cLE8FbjXp$@;$(&7FTQn&IqpdFBZIuqII4H(z9mTV*_)+#u-t2d&mzZjgaQv7kEwHzdXJ8CTE{L=F8G&Has(HZ4MG zd_*j%4qfpemA4#OhOOjN%Za!LeLxsrwt1-}+!~oH>gIF1ILSA#=!a|0a`B2gwk1wo z;q}{;UU})tG;~Ul$;xv|`tP`&pFrXfqVP9JX+DeYK+#Uhx77nrV<6j5v6)$O6juYpk!YGMbCY2`>Hx@mPHQl^+HQ*JK(a_GgQvqz z6s|Ok>+RSA7z@Vr+hTPkpQB$k^Ijiya=-NS?##un zQffNJpK20SVhhzuQ{y&_`eF5GGccASNj_>^E z{@3P@03GWy&-y1(gSVeFo%SDWQB9y4Mm4Bp83g4|24_kqRD8;PFnPPMA8pclN_4n* zZE@23yK$IPzVe`-^@L<$Q|6QGi0lgxKLeRyKz{(s17I}YUui(QKgNop4+ytDEb{Vp z0>r7;o~RqG(rcgH3OZce|G{Hf>bY3B{5c&95~oZgd;Ok^`e#9co1MBqBD&)fzZ5hD6X_({2o7owd036Dn31hotb)wrCf%K)&hmCzTAXF?3+wey z;JRV@Zph=Tn_3C(8g{FQ+LZ16zCSw28sK{EvbF^Nj46Te3t-~E)0TqFegxSBc8K}e z_9QLqP*!%;Oei^DYhcC4#=wXF%@Mb>oF$(4v?mwEjk}NNok+Z8k?0b&=SXX-raGWj zLm?7sF@Z9wM`o4~f~7hpcMVi#m}xi@M&mJrt9Y$hxML#s;g*K$ zB5hCQD$g?Xj73MWn$|fJBdKm!ScP36+hD7nWC%&fLlN)dLBx zX8cM7z-|LXKnO5u`8y(@8Xy90_A8zLl?eE%t*Fp4dbsS8`|)#iOV1e17fw2lty|QZ z6k`oaMz#IiR~(C~d(2$kS8CuogF<8_5$R=A&OfnG5P_=8h~E(rNSZ`kYLt@v*PsuR zrzzfBFJ>bfJhLs_Q_WK|6^0sgU<~@z9J&s!UAxR#uDt}B+LiFAc-y@ja?g-<5+KTu zp-6%CzSy);>MY~9od?A(Vwp6URTUH`;^DD4(rf?tVxmQ9u|vXnxfXxD=`f#r3b&Ut ztSawDKJ=c*KzmU8C01zsgSio}?`?+21K$Gjd<&TO{F^QRhROh2-pc!(%xfFe%iBdE zr)cKXvy{=OCTag90<(f7&q^Cu&}qO>ZlE|rE7kZT#>&_ywA{~J61r}GxnJQb?$X_Q zv1&ZoQiOL0L=6FeTseozhoyIyNV7DAUm*NG=aVH5Z45SrQq^8@-%5SonR20<@XbBi z7eyUi%Et9hY{!`^rkNX9TU!UIxi=P{c4wFD?SWd2($Sc2eP1Ae$7Mn0e?#s0B+Wv^ z^sj|!6Yn+v;oVU2qMWoBbhYnWoMBD;+Z9B!iUQqtI4zRu4Ds~#ewq{h`cRepVOv_Fh?GHf zC8j#y?Rl4+SNY>l1N4MA-c($Ta8pEbBBrtdJ#(vbkVO{^$T@g>d!Qs;uTq-jFgR zoFmpmxp+`-+L75M!?91j5-;7smf)+a)>{*knvQMCu=nxC)=jvik6>BLTN+dK*Vmb; zCQHHcM5nAE!i4cscGVHf0Bev*<;s0w#xOu+0wx1q{jH|HrO3H?1VIl5IP9M8I#vDT2DtwUCns(ogFF#&VWw< zki+^TO?S#L`RqTQNNDddx`NGxILkb#=TU ze!3tod!kY%v1>yQ+|tyF%&+a`5x!Ym{iXO>Kuw&lb(k5K+!?m6-H`1EszRt)IrOzW2<=84T4HWllAnhmQL!TAxnKZgUx;ex}578$V;$pG1m4bi58XC)FL zz?1ESc81QEui<^$fXf8@oZq&UA|f^gd^oo@lYrRV9@@PEi?$R4H)TxSF> zM3MfWyv5m;z=Mun{;}l#!5nBGCTdhwRkVtHvTCg38FS0w-gn9VnJ&+|a~x)d3wVJ1 zD}w6Qib5#154VyERqb3)*5@o&`c@ctBwZ-bz7ZW;-AH#YWR&`Iw#tvGb>J&D+C==A zhrwWfk5&RO5}Z|KzZP7Z3*{nX$38r5o)6e-4R8l2AKU{b!lDdee1J4w+YT7ci(&_ee zJ0>@t-_{=mcA!JPhV%=cq9U3mo$%6X%-hTKY~d|Op1Aw1Tt-%~eCd9h64BDpAX(dN zs!=0jWo_7w;tT}3!vN)+88{lF2p07R>(gTP#gHS2zWF|d{-KvO!E~K6fd<4mCcCWG zlC<#Q+ZTL~>+5BxZ&qJ@(>Wc8e1vf3XRy%?{YgX_t2ZeS0T)%d$TW+}uQK~yZ+rsx zPWo*kp&b)3=szGIQ&KS)+aChX ziJ8jKCFrD+Qh0?||(6oplEI-Rn51*Hyse=K|1s*1)qjnvR%f1mwn@&Gh$QcQq=P z7sRyPo!d6!k>~KP#&&6pTBEazlsHgXEqF`E-ul;MTTbz1<~EBAAKAh&=2>Ti0*MDT*CUoby0s4=!uo`U08CXgX20{hG0RDyT0?@Jd>K zb9%4x3Sqh4p5O{~91Lmopngn?H3&YAm#JQ+=uZpTbg!WA9z(g3R>r(K@WSv@1R{75rn8V?T6jL0nqILW+cTBCr|YOp2S6O zr!YLpL+%iA0#d*=A)iBk5$R4BU4%2uXd5IE71T%#ED}+!n*edagr;pg(L4#iNRDH^ z3g)TAn$A9Di1}pA3udeje6>}_jK5%ORr9swFh%(2Y7yx?zjDXsO#E- zw)c-=jgcOYj?%OjuQ5f-Nbdm6=VX%(9=E1T*2y2RToT6+*qX>08{lJGqKE%?`j82OJ?GU z*clB%a-~c;;-^7y}nuuuBy>N4BNxbJlysqVfMJuihzk`qIT<5$U-Qr2GVy24{` zY?=NA;{<*J)cK#m6^KV6z>tJ10+{k^0X&g|bqUZ89fAw#^?0_~WIH=n@8r9D-&sJz zy$%Hsxh|ZcP3*%EC~6PQd};?2>iv}|Z$*3C*Qu#N8RFs&CNzRS2S}jnhlCWaj?Sap zITBu8jPTlX^{&;A_f3`BHbMG)6@0!Rkg-5Nxl<}=?=H@viOXotNiL0Q?}+8 z6LpOM``?o`=)(?s>gq!hdd*NAMXk%~b`4%}C%Ow|nEE&lPK&y(lJvjIWF%YKFK z(uy+_1&U-9m=fKmp`QV}>xi1e@JP|JbM*^o-t&U@&5wNe!fqX7S{pU9zw}eNME|*u zT#q&%1g{YwPt{EcEJO(Hn)+R!D;7absr5nRAQxYH1C3Q1&CBXBoD)g20T;PuHAOZa zo-Zvg3#gWh9SGB3UCK*Inh7eU1K*9K+46cgr@C&v+!Hg7f3>Cy6ue*4I}!UEE>Hwz z*@?PO*KJIQ5i!mbWwcbZ`XL`_)@YJpbyZp~^iEUt=5Fh0ft>qSn75yp?{jJ+qZr(W z48xEIn7pn`c1n2CTmO85T~w7F_uQxn4Vw2Qwk~Z_cA_}&zTble!T1M9Aw^r7I`!Wp|Uyyb{Aov}MVVtH2;|duW zvCbL!+|rO(BnxZaPz5G=-r=lEY8orzWv`7bU4MRBI=k!q@ssZ_9kebdbAAvbBdL#Q zz@P;5p3NnAfOD=)8eG*YwM-Cxq~lt$vukXo)8)clXCK$3tzVN)DRs2Xxg{|&G6v0k zu@o#*QW|sReE$=_Z3NhSh_*oG*iOeHunQ#C4%mBIj2=0@_MHa$v3H!8PWsil_xdlF z@U^|J+{X1T-NE4@fX#)It_4X#8y7S)R3g|m~8>@<7xes$R( zg5~}7l>>$)xZBNMKCp)a@=5P3%T=q&SrS_hj(fM;1W^rWk2K}xFx(9g3VTZ+q^+Pq zvq_L5u_4M?TSsQryNk4rTi01|+_*56#+P^zMXhDA%-MV67V1l~d8)p0+u+kv%|+UZ zmDb8QYq!!BXP*u60OQ#7KLZk*fvbBePv`6b@lw{SN?YMOAn*HkN%Ja0jkdw@AK?bst2h+9^o+;PgAViF6 z(9Gl?zBA&@=2Iedt1Q|nbNuD;hRVbXgaAplV=qg)GOmG>Q8oQnyx_O&`SWuEii=BD zJW8M@i$AQ3*!n{oN2m;u(LU{hZz00lY3tGmY>+N3x5PiO@8*aM;}Bdt*xfm&s-$sz z$w#DTqO&eQP(tSEe!XXpTF+HqKv9CIP>M2&QU{LQ0Ucu4=g=VSNiNx~b#H)Yc2Csi z&8O%o^s$`L^>dZ*YLzKpdhUcZbLAl+p5>PtS+t%hVJmzdm^09C)jLsSg~Oy?ZcN+2 zG`eq&Ni;3U*KFdO!DPd9a6~^`z#4oMKLKgM9C2fwZUSspPflGgr~v22HKCS#@|jcc zWxb2H?f_roON)5R>_@U-2#D`Yo=WBjvkNF`oZGGJqR`u^eRRXG`P>2gll6Wip-tSV z>zp-2ka_ewLa<3--d2Rd8U6#p?~1;bm;tuBi4FcyrrLYJAo)2 z5unh3@0|)c%Lt*_Pu0f>QG+PM!>9-!I#j+TO*XHDAbVs2dlfs=YXfBtdOb{8)qXI5 zwOYg-YD?`|Lk?#zm3{F~tJ2tlDtVU_CpD!l;{w&7!Nv-&kKT2vOmto7-vMQOo`6gx zsX{X!Q>r@#JN(X~+KXr>2A`(gNt9YraLh3tlnX^B~S`k?p?b z*@Wzq#Uq~4H@_K|>y@NhYvLwP;e$$gZr#fm*|P4&h1@4Y_J(`{XqsZ?p?M5vgDFL; zRrCb8jmcX>9u8}><;d)_GX4^IytckpHTK!KYG=KF{3MHb#)l3~laC>zb_c|Njz{bn zGJJZ*m3f+i1gx0A8`>Hon0kf0-aFV;gvGrnt9zcUCst-!8!Z4|cy;6?bxleDRrvkw zg%Wd1(}MoI#l-q}oc!6#vEt66sd^g4OFkZ0@m_=j=c7KlQpo2_0dm~%{CwJQM!k)D zU}7GA32IE#scEX0#`V^wSf0iCsve*wMB!J}CU-zM$Tn|Ps5PD&^UV*K&#gvm$-0*i zrL0+OD>q(TRarAR7pKJ5!u}SKwTf7*qKm-|wqL4WfDwcckxZ76hFx`^a|;X{J*U)a z)-CTgHPtkvaQQ0PAHFks5O_q{Q5@vRR+2F0MK!1NE#~LDG;#DZkJ0>$Y5D|ormVtM z47qp-Wi^I=`2`47uBC6p9Kte8Eyg^~>b$$LGHKpubo+$@{Q72X+6H>VzI1D;u6{Jw zPlA@a~^*f`h!g|=(~5bViVtxV!;1m@5|$%Zri?fsU)GY z6H_5dxFSooX}OSuD8yhYyNMw?W2TZNOF}3@w(KU$82e-oMb^oPG1e@@3>w2My}zFO zxv%@Wp69vW`+2VS^ZxOEKJOp?bI$MgJI~`d&f_?~$MHR!vc|rv$_pG(mA=2Dd08dU zhXkfTz=Wu_27J4+6oB2+!%1ka9@uoo`jM5-M40()D9i?1XRmRs+R86DEA%C^2hsc` zX5Z5ntm3P?P?~YFIsFj{x+iG(5~S3G99tCAdhFKj%Tc2cpWZhmvbe_NU{I4o;bTTOOvA9Daq9> zfH0-Zv1KTQ?F`%=H`tREoQ;Z7i-R~ZO3s^67Zj3{N3?lKT(qj_3r$F=tg!7CUzjCymmfHLk@M@=oC28)|fMcPtv!bmAK za(QI6>onuZAbe}$!>rNj+SbBIx{b=+n2Sq+QZi2u*zLF4JryIHIV&qGr&v4aR^I3Q z_G!8Jc=?+3yKv$F70c9G9S~|}y=0oq0;!|}O|CQRqHYb5I7-*7Rn`hau6@XTETpa( z8|ruKnQ{FTvF~zzvP@%db{!vA0yC7AjU$zUrwhRR{=6EdRK08xE-E#tZ?-X(ynm+K zgesVdSKqc(e61nS^?0>CNVcAMf5_mmy7e9B8_3?=+(>t;Ot=?YCf!yhISnE^L@qB| z9UJ2^P*ReV+8$fkHCTLX3dZ18B{a6s!YrWN%@sp^;`^kIpL$wQU?ao)@oiM|e z&UpdW7__I!iEHOP%qNie}lkLt%`Qxr?R^*mUh!*vsumi@^awFQG?P6Ont5Dhwb_GfoB-+R-xtXHie3 zw1*IuGto@tV3H(=A@0V}30xqt?}Hq01+EtOZdAV6xYj8X~Z5=NqUgV@Porem6C5ZYfud zsvF;5(onUuk#K&;r(jjs!mDphcvbz;iSFzb+(AcH49d;kc*eB@^%#7B>3nw<7n8^X zlDs|H9XK<&h0JIF>7fI!Vpk`*AtR^FAwwlHDeChVqaKV#-SW3b=yp z3}d?n+>jaVx)zG2lzl=@P zyr}4Gx<9~2bm@%^la0H>~>G}h=pZX5H_H4 zsdBQ7LMUqXIppsD^6_zHxsQ-CaFulea}PDVQ|~-IkSfrI1dZsO)OQBQlwojOUzc~o z`tv-!YG-KunivIFjLL6C6$vua(YdXA&%twwau#3qnDkpT1~v}`Ha42BScZ94Ifou_ ze@k3M;kIU`FVDtF3Kze9&R#aQf&dFES{;8zEW4s`9G zfwklAtdBQWfMMu3kXTFWjHFzf*1{Xw)V?AAPvV{@mphdlYcp(`AT~qV(N=4_dr!E= zA7f>{=1nSwSGtvbTd+Lc6)m$idjLbIPc{qQWk<{B#!%z`!MWqyUK6mPqO^VRT7^#?O^E8s z6i5JwAVV4E$dBw}bPQFY%>k%2pP9_~ zbRg!8=$BdF3wn_vJf;N~MoSe86cvRgC&{A$fg`WT&h<2m5M`hPN6?x zJIfwM9;d7)pqa{VnMW!888eZ@5MclN>As#r+v8OwSMm9p&5-I!)3&%PzlibLG@ePs zWVAF)q_eah7_SX&8$9SVP~XIU-2rl#J%ii+LOYEl{)z2bkq%rGcn=fgF(p5$V>xTo zWG#%VpkE%i6mB~r{TZI#V@pu9y}I=+|MiP>^V-WLNe5=_))R(xw5eva$D{uI57`H( zsl|bm#ST4{W~y#vqhD=^$yl+kqpN^kcF=B(ud!KU!UySwYyjI$dalew~ z`)mWU;x?%PbHK+!1gVEjrvi{>)l7a&5&Ba$!K@2w8@8> zU_zJ6r6W%i2d%f+%0+!QxlFvV=>m(5zeh09vwk*u{OYwHN4F!!SDiRK6>dG?z7=P8 zrfVbFI8@s}#l$`AR?;>6gz;4Om~gGxWHZ~s2Ni?Mp`{2xjT@eAUdN`3u}2S8Ds*ce z-|4-0qK@Oig=xq1N+?)nr0i3ktgIh^jTv3i7re1YU(nLfkE=Qe&erEuW!JR=*F3%- zN3kp?Qi__mu@X4ad2Ck*KR^eytI&?xkay4i-o?*KZSe)}feH@f;UJL*)%fck!Lw`R1W%h}7%vnmhVJ-?_vVP#9bv1%6}S#k)NBqx~WR5|bx%ahJMG zfKK9+ohXKF3J}IC6g}_mb#`oGEls#DE_Kgo%P($GwknQ6J3M)#fh6e&Xgm8SdN_lW z1JZtJH-IkYS6~2J9Ctx^qo#iLAU~yNvkmO8uv?sdaD0wOf@iE5Dg4mS->Y!X^u^_K zabmjfb7SN={`udTyarBq7jBdL2gkenV20W~D`Grq0YE7K4HE1?Lv#V^o-_d2GBOZ_ zlimPq+ua&JnYJNW{IkmR)2^+!D7HLxe_B~kxLu_g_cGN@YpslZWQ;E=cdBQO9J6v$ z_-z+Io&F>>$=~v5u?q*jlzEeW_YLy_-LZmh*fHjKi$aV!durHU!d&NhY^nS6{HF^B zy({&%<4S)~Z55)R+xW-Poj43M1_evltNiRdikGQI1$Qcx1BGnf^Z?`d2ekb|Tj&~D z47KUD;@IsM|}dovK-HtgjfA*G%exBA%jKR-Ozeo5tI@ zN%SN$u8>y%52q5KDSxe2W142ZpEm)OPcJC3ZNmCs=hg`1lZw#|fYF={`GwQX^ zB{UAZ+rWU_CgX|?E0ZZX!w(7qb&7<5Gb)%GkC!Lf)4;GyRCQi`#EIAU`Hq?lcE!Hp zJQ5do)Fc42Gmzh%6CX;FV2?w;{6ss#cdudqS$O>U2gf~Bn<-G(h0&qZ+JVa`(8w#V+$QJIY_&6Ic zDd8H(WycrugEusfKexXhGiXt2y9ChJmMXcfHLjHT+uAgLbdXN5k*x~&Zd6d)2g@$H zWrd2+Q7)uQwCx7O<`b^mEpQjEw6U>mJ15z6uIM*?shBr=w#pCg*x0V8IhH#R)&LE> z+JTpnLX{sFd!ti*WBCe*}PZjw12KpY4IUtS2#MtBqJ`mh@B}qR3vjJiXC)~gc zpa5+S=M1|u-e1$$e!brC5#kNcf|FYp@zu3CD^aa;==j3R zq1Sw3*Ii{Yo5+;~WNstBSk#01^=wYC2me0yVDbu$ErJ_)RzQNiB&&s~S`ET$?9EJr z@7d(45FFYMEhibYCidP(s1F6yo<$CUKz^w4(CN30v!9R?7L9{U-D3~Fwik9K+0_MG zoT#)PH2XMP%BKo_4H7`yoB@k7by=nBEl22WX0gJj@NEIxKRAwV)kV+>N+9`hgsj&f z)1;}P+0}GJM4S8Igrq^zlj!~DkVE}en6dOiIoGgY3&e!YxW9Uep(O3v zdcfBFx8!v?sKjz3A%T4e*$+5@UF7|qjvZ6yDBxH<)u84zKZd5>$)HpMz9W73g^Ro5 zy=KNa-e|{@w~idX7n^qy1emDDzkT%}3b5saR_yT=%F4>@Bi|aVTO-p+lGpJBn{;~v zZwapLa<#Xn7d9So?RCsxmFh__4OmTJH|4mEAkKC+-{=-DYWH9em;T6i^kF;qKykf> zs!OGI4&!A38paol(ym{YB()QS24v#BUm@Oo0Vucn&zU!+BO0`AU_)g1V#_1)v8CFf z<{=|;C@f6*Z9_1~4{?evMuI--n>j}cQw9p4k4`>V=}5=!ULR(mZ`2X zTiYS;+=gD}AibI4ungkOr6iEKrx_AO3#|O613E|j5+y!(GChynEs%+R^f*zP2)X*z z@k87(N40)L80+O0@i9mg!Aa?!5s76B1ffU<;gkkR?JJ`#r-SY<@ABnUu-=-HjZ<7k z?&m~VK0mKg_H5{y`NBpod)vn>YSO0Ap}ZbF*fXVJacux%<36grRhd0z`8sJc?0YRv zo%nTNR9s;b-43csh}6?Ye!+1uL9+wG4hT02ErN1wis=z$o~{iN9oS#MQ9GjK_{;@T zA^IW9DXC(Sn0j9=*sKd38vs5Gb|))$rR!x-0$cU8KI>^ONl7#g*JN`W$#uvKM-~Xb z-fl=ON-oCMG{=uyI%77n6rxWaZLC`GZqhbw);CqN|ISeAo0?C6tTYA;8$YQuJ!4W{ zjt`jqwDfjjd0?zWVFTQSY`q6tv*7Wz{X@c=O>(2V|pFh>;p4n43;=@)w^Ncys4hwH%y`2fu9m5F zv)elTo_#lsM^S}sVxhR}Klus*KO z#^lXFkJ!+!w5RRX=4nCPckOG^0&iYu>lE~`|H9a}mo4ZgJ~~m{?Us#E1^~dL$U$3t z8w4bx9KN2% z%Jo7y`oj|F2LAj~avdGNT#yn13M|RoWwD9XcgF-)BLH{erlzRc_mrT3V}o&WCDy6M z<8SN9o_-DPy0-P*XRXMdL-b8mQ7Gq*gtqk-D!7U_dp# zF{<`d(e_mBCWd=WiaaKLDD?0r%*EpzVvp!I+dzEQ-5^Zh(~KFpF3=Mk5Bt}p9~{D; z#^U^Od@rb@3op}rSdaUzDCT;f z5Si|kQW6wpPeHXOa5JUpbGZHMTc}^Yr3XI7lq&($y~m>vyDtJm-lp6YYlf<8e)JZb zcTO2!OcZpq{VLa6AZPv!jkId0Sr5!@m~`l~cDmN-(5pT=4l5iFoTv_+fO!qzuPJPH zv$@SFo2@{TuSk>jj50UCC#~&UhH4WWYmugapCEMn!UD}-HdlvLI~b_}bdWeq+Q;~U zEZG;jBcu$aODsM#mu4U7artVF5}e`Ry~!MltP7bM^|hTqW(U48*B6@0-1BEBVn4P; z4)tL@6sQXWB4k^9wIN&IAJ=WR@#+aKt{L?0PVyrMGs+5WlI~8;n@)(;I}s$^@jR%# z9myR^SG!Qt;kl%nB$6d$^NVxsbg8Rjl!4Wm)>0An!E@9=OS&QBRM1m|$`@*3oH*zJ z{dR~)Lu{j*={zg$b1W6iN9t!l??b+@Xm)Ly)B zJ+Mt|&P-xVFvWIxC}}hL30-CpSrXKMS3;9588h)p6IM0PmMmSLou08Vw^LAwJlKBx zoLE2iiajs#9=lha%_*hIN}Q#G;cso2HrT;7rYW{s+dukz%4b@iRFjI!4jfh8@yoZQ z15#$ayykS62tb?fPf0lst^`e-M)>EW<8@LeXHSA_k{K|@^@OeP0#Gxl!H{!3BLNn~e12o<4_|7j?*nu$@OgI>H7DszBrvG8QW(5c^#lXw1ocrs+2M`ya$B?5_r{K}q zqR68NWqNxd6QW^zZtP#%+^#6zu8@9AvR&V#=SHK=IJA6t6%R=t>8P9P-JPgyXlWiY z3CY_+&%TW%0fpa!RR4r$O^>EaKZ&m?A_lx^R31*A*vA{v3b{Lwjo$ZV+ra<<2&M%qxg9awMlh)7?fhajbhpk$xQqL?r_-z3=aSCJpRr63tpKqP7MHI` zDbm$|JkAq6q1wt3AhVDMiM<>%M4Km76x*x!>Ovtld~ouy-j<7d{8dzZ z)B89dEw)`~c%~7??vF7`3v6DmG7mgoE*I2}Qc5RR^xZ-)H-hqCSkD7w`BFjEv{6=y z-UZ~4!yc_U^{G>sL4+)+=5ZHky$o@|)%Q^PR^{ac!PN~D#a*p7YGZj^sGa(l80rXM z*9_ai@3zU3r3elBASJLP#1x(T?J<-eadOD<^A?VGvS3ZbeB<5-TqmPv*h56h=B}&M z6;b-A_t#r8%cC{Paklet>%K;aEi2GHPcFvfRN7K?HL-ks1MB-eB!&)#fOb<&>XQaJR*hUZR@ zNPDIQP$+SOl`%_|i`@Fb5gSWtHttG2%GAT3=e2+dW3VHI)tIJapuBzr{zlmNSis=f zT2+}}7JGy5Jnvqx0!7X`yntC0k>#A%)~T>&bWpQ|)#Oq!)MjkRcEUcOp@BSHvW&!; zL!Z~;4mBxIwxfpD#WoEZrG7&Hj`J`F{QnFuPd(QmG;EVQ@#ay|Yi z>#eBMh=lA6_Fe?xBo1g?pqN7Ueqm~}l50$q4e2Rw5LTZ_O}H>+$mcxn0(}qsgO{tG z9QF0TOpSo5yIMk5uUe}7GVSYfK~_fzG*J@Y;!-v<_Nm;VSXWPSb@*UV)TtC4dTbIg zkk=&iM|{JRuE4%Wr153|P;1$>g)USb5L9AuDnIWy=y4!+@6XO`99hUwsu-wX0>ui?lEM~>Nuv?c?6DCU7dPIbk;-{a??AgFk4<%OFG6j+e#u1W zdJH$uq)sJ-8rV0b1;mx~bd4m_dWFRA%{v{f7uIkJssN z7}3mfilsfCZN=1QrRs?=b(%)>`o{!gePH|f`5d#fOf;;MEs2O&V6m}+ey3*FNlzJ=P^6+ zEWq`$V_fh>&Kep}_|Zq?V@hzfgN1@(+fbrNzOO4FN|722dV~&Y)05KDYb@&ZoQ2oI zdQO!F>R@SAJBc;b9aT|{uT`BtXgdHkXixg200D>yT|~9{14u|Lzybm!iW0QRjpU~I zSF=b~V;I%GF0Q^LfmdrNsmeO-yu}dQb%<(P&gYJQVE)3g0@zbGg_i!|#9dE)q&2$_ z$Hx?dQwBO6PExYFK;c-eZsr+YTYLwSi;@uaETLjqB_n8poW5aHGC82gDr<4_JWD;B zv$l9>`~iOnLXOTky&j1>jB=dxHKfooU={S0cIyymjKA4&we=X!?DigQ!=jJK(AI@k z0e+p9p>R<#w6;*OM?5EHK*{Qump=;}_wm-YNC_r?GL?U)2^C>Tchy zRLL`4Q*aqu$=h@YGfnruu#SvJ*MA2xUroa|Ljiw#Lk37kOyaigmWfYM03xENQpW*R zgR?|o`NSvRI92G5i$;X9F% zBN)XSu)taZe;g(gWZcrcqhY2NQT{dHK~sj{2M2+L*E<;-zAG=RMtp>dYL|>UTl(AF z)p}_<30A%W@L{-)Q7JuOW?|)4WB84cvi;RzeDP)Wmj(5Gg5S#YIR>ii_}nv^ z4rG0_W0Td%K?5{v3aCRuIogWQ5>ESoRJd(eKrcW}_<(2yRTn8|gKhT29?@31_a(Uh z!5;MG+?t?O<9So~iOgu48Je#79tOcD`Y^2zQ3`16ijz~@ru66f&MeMxC)Skgpl!Zs&2|4&X_e~xj z8ExZ~WUzDi!gJLG#&KhS~F9%;Oi;tx(siliwY;M-`|0~q2O1$ zf&2xJLy*C;wms~|h|WQLc`ng|z|JXkfMmS4nr_;@*>jfhf-L2$_nyQ4&7qKeLKfZk zWJS15#v9kRLvdC|3&pg1P}cPe$kVI@;F=t0os$3T&(B|z9vG+AK~;JyJ>vBy6LbF8 z7mbmADbBSiyiKyUT$c;>*c~+sK&8J078! zb9Gk#ndZoulDK`G4>`692lahYYJb8;2mgH}Vu|(}-HbnGzX4nExPl6dfW)Z}(96gh z-E_k*$}8W{yg-p~&RY~-6il<-!Ltw6|KN~`dXM|loXC=@Y|>4@)|e%iHtu9O9_*&c zTbXHT2C&yO+r=bCGmdSug6F1%PG#fzZb}$7y4lDkuO)#a!lJ-tzUd0fe5(Ju36W|* zW*qWRj|UoGaI??%7^;JKx~~>lzlhJe%DF{({kI8`ouQW);cTD~_M1UdY)6*l$SJDO zregf8g5A~DRN)hkaT0c4jFOnJb>!YqI}lwsQ}I-HWnKI&=A zek?-VX5qRL=tdaj-2+e*k@kZ_oLR^g5ZPpNp&3NL5d3-3k#b}9qiy0g3D@@LMPSk? z;8`btXQ3vTZosmEb@rbB{{#PT?*VlDDUrzJ+-@=Gj@{y6gcs}t1X_3w&lrqzYm0h) z(D4o{1+kCB|1J`ZXf6+H5u^k*ST5bbbKK>D(N03h2;+M8=8zfV8-D!O2k+Zsm8KSU zJ=*T$QX!qD+4XOuUIG>L=ZaCE^%!iX2HhNp9=ZyCa9m`pGbluoLniGNcribFdoYiz zf*LRaujiSwi>AR@&<7xV;kcCJpa0#EDJ`DH;#|kAx1%CL0to<=l$C@c8YI;808>VQ zbbd=b_`BgA<_6<=SV&mn0+-oI~%S~y9EGjK8OYwUl1nV$yA@gD{XZTkDZ|1JWoo9}_)Fg@%&-WBnaA>nCo$f!H93XM~2R+Vf003M}gH^7@$R z&w8zha?5@Ku;)ES7!|DW=F(#Z%e{Efui!o+$IBA0=AAzItCiJiucod-EZvvE2MvPE zyv>|76AWqx%C!a#yQwGJd`qG~lQ?j9Fv)vg`xU-yXLkvslO?BhLp}+0)AZN2@^&*-pU;|07d+9#s;=znC`t7ng!|cK&8o{=-eS zksXJt^k3`*#b`l+0)?Z9%kDHdKmxsf)dKq!2)qVy8<^N*7|{CTzYa!YT^I%;;|$C&HhOLH3>s4r*iHr z(s@>fR};?t4|O%+yV)M*CX@3ouI2o}0hXixWw#^i=X?L<)xcN(mrl#Sw%LEQF`CUh z7jdzzggH-Vzbd1-`!|mq`trbZ|Ao$be{wsm3t1%>!DE1z7$$D^k2}O~M$>nnRi>7g z#kO?cuswuz|2LmxlSV~U&wucw{`E^$!2jlWCZhg=t^+3b7}sXs+Lgaza`RZ`fPrh7 z`)ig$6EHGg!~dE9{dG_KZ!Z3Sz9jy8Ci&m?>e63x6949C{6$Ca|BjpfuZ8RX_ZPkk>(keLdFUCSSq1W%+y9!$g@kJ;&FAFOL<3vvBEyfU*HHQU8_1T-ow zw50cVs-FzOrX_`LC@jF~XZqLaw~+fL;)#@W$gD2zGrW`*w^vZ`PObUVIiso7P5B%f z&m5cMn?B;J*n?#!?d}L9?MLlS`^mh3{Il{z>miQ^S)L4t4+VBhyL#i-q?=4b_Z^Wh zsMkqXS=zb^n*ucK4w847qv+5H&qTiG6+)9UhYjT&3FHldTn$PygDM`y zvrf3)uDv@*T}O$5r}GJg?fe8ow06lZU zd)LwK()r59)_H|lKj_(T|3Fj~S9kV!^)xPg3m4hKNhec?9m5XG+gNqssICV4g}h*Y zRG8XCr}*V%=r)$Gs3fB{g3G5z`Df>V9bJ6}@ZaI02m>fz>+DP9$tAX=$>q`WWR2U# zRFq7#)fYQs!Rp|Q+`9Bz<_e-6UX=}ql>06cD<+O_X7^#nDiliz)Iph=YoB25a=82T zubq}KftUub;jk&3e~soR9$Eo?hZ<{7pYX{cFwauDAGZj4q%VZ?<%Ge)iapXXotP>U z&hiGcLp~?rmJggAPxM$u%TF#&aZ$VDm2r2J$FDfhQ&6PrXgt70X80Iji^?z?IlH#1 zLl=tZ>>v`3N;G!fgM7M^sD0Fy^EH2EiwIDVCrP(14B8zU{VsVKNK-V1qL&Au*Wz*^ zMR_r|^S(q|DOSe)ViRfhF{nG64rX&tUoKQ4`QGtTO$`+xYb{xJVERb2erea)6L>^jHXdsOu(z0jn)xuc%dgWg6RVt)$I`8 z4tP6YSlb|i)~Ve-!`l>iw8ryTLj54D8!646f(o^0us;QmN#sx?3i>Hin>u`jjw<#@ zAW2#qiI=GmZ<`3_nbtSOtbICY*L{q(d3C|*Xi-o{PTFLXE<=#1NKbe>L&GtH{Ehm~~J@ixOAR{SPP}|FWq-pF04eOJTw|(J zQBmE|I^KA_U#ThR4sQQ?j3|I>vmSi44Gy#-%P1a}a(?|F*usGN%UVpV@Q2~5EQPaq z^1VKzn%BOT5bu#sp?mSFMm4yGn)|G|oZplYJq7eOc~KH+k@9zbkp z9rPTAF+!h$d%{#Eu|!D7+7`}tRBUXyj&q*;fEj|1iJt;-&t*KOA%kgkOW7? zbd~2DPo-lfNBT~7^h!88ihtq08J}CQeehA-eWIB*rRkcF%%4lJX z@2nGW%%f5g834}`;Pgs2VIh#Bbxc9l-t2+fb{^Z0o*Q8_9zM|Uw42p7@Nv**$Rh`* zl!jZln0qJ*?aiF;vw-U3h?KCIFQ-C_;OqCdRGoeO&-5qi;xqLYxez8=b3GeP9yzcT z+;}xD_%q5mA>0=FNJmwvR6Q!M=K<|g(WFG_bGf=yQcA&bRZ_tnv8s+e^{=YBCS+V4-eKIcZ$)&CSG)YG+R#*guc%?v74~)l zLQAQr*u{K(Ib15*sg%J2u8D{~Xk}s7fFKh}S&RpcKwRmO+|wq`nThp7_EX6P0!j*gGLJ=#rcMbf`WTFEJfEe9kezSJQ}y~J>$FI$SW?d(o{l20I2bj z^+EXxa3=uoBIKr_JoNC}BN(W%8KrzK1X(PjK5VB}(DC?aYMX8&O*1vv7Pam;3jp-lLffTxl*CyW$4m>83KHpCG^4s{N z@5w7NAM=)unU3oqTJoK^fEnz0|LsSWuP!`;@z_q%XgGdpIQp{KBxCs)>!R{nrOv_KELHCy)8e`uPK#(5JOTv22>|L-ZeS1LNJW49EDLMD$S!t~@txJ({GuFd#(JvMrD{r@uary;A@Y| z9@M}s0Ma`J^c6^7%&p_!!yb0vr)L1})~cuQx^=^=ruCEL8U?!F1W}%xyt-X=xpsIu zoLyq|!NTC;sm5JtnV}c{*ZYM|fFlZrO<9kD`SdMLz>jg(nd|!ky4h*M*$$#S534r6 zI?>kfV3|-N1D75ryn9&|aqH-V<7o%qV0(rWQ%=j&XH?l@zhpW4HD>Y(8Md)ytEp*` zeq^X=;@jcx5Vv(jC%3FqNv8$1jy~f&ea7(69?1jytC_mMt^+hTh)bjuiQ-eE%(I?d zh1|6%!e0l(lFn+&8}=Sz#!UqEbC;ydkQK$wl$}lY7=Y_)NsO4=OvzEbGN&g*z0|bp zR!I$w*mn`x;HIo#E73gBwf<%BvDX|XB8^qc*5@rAgi0I4v{JS^CPg|O&QrOf%DnP3 ztSFUO@zD z7MMdEu=S%eGHPv?l(JMF#U`>>MZoE*=$10aC)#LWlXDlt$< zH|;a)91mOj@D=De<`bqvJo1(A z+sTQmLXi8Z+vmE^JC&C5e$Y@*IP{p;&(dB=ek3mGh5hjI;}`|)%hZ6(85r4Os%uUA zRSg994tmCwC51Y3p{aVk>h=I=s{4k%E{%;V&Dqq4<9AuSKx0~>^(B4RpvKMy)I+9X z5zMyvYk-zRir2Qa^-04DJP&>AHXXal-00k1Z$vE6Ag z{lTFDPs?O_PBzBP9vd80Lc^09nF6Z*(vlKndZTj3RPH;ZEc5yxlAnHNvqSGhL(;(2 z%5zT_jNQG&t|y&!fAZ9(-+siq5M2PjVXe}PE&?`@txN|fx_+TUJH)#RN_Ij}5pe0@ z??xwT(@Et@GKW(VoZR|5Vxy7YG>QGcdZVC)3xL5cG0^H6N11I{YXi=}pS8t=SHt95nQ$9-pS<9S>HZWZi3(UCq1`zT+ zq<~m_Q-Cku+KB`FTZi(PbA~@3@iNpU*o=9e>mg8o5kN^`^C|w|pf`X?Z*+iyrz_Ye zD2fljkkyGVy%%TBt{7swNR4L!^&-4`rop?CP0|33TP%vLlt6dm-vhKPl1U)uF+lmL z{>xwT1W~0mxK~mC{}cY|DJ<2L+v4qqa~rGbu}w9vy<*&Cjv5~Sen^F%WFNpAjCxo; zTS>)r@C4=Eo{sG}&?BzgTd*}DcI?sG+G?1wz*OD2o!`8-n)B^@ASI$>J*@D9JhFbf=|!2hV|&h@gu>}G9G9hN3D%J~>OODbjODFfmK4=23! z9@;T!0;-a(xN92%SldcANoY49OkoJ@;a5KU${cegrTG`TW2>H-hq0e_fXWqhUq0c=x;Z2D=is zo-HtcJJ=!noOfvNq1Hfw8i6>MdKh>dN{Y;+`m`K}Ff}O0q;!I%T&OZgP>sEP=Il9b ziAqpreV#1$WK#aKlpTOwsK8WBT60BSz7R&}{bajhm={XuGaMeKDSM^C*EjK&yV+dK z{j9e-0M#jBljcWtc*Ivu0@4{_4b;8Qmk7Adca@0B#$23WlIeAFDlR3JLv#fN+m=lG>XbjSvFxD3bJVXruQTap?T@j`joJ# zV)bNTevutvo;2cr`Yc)c(RYd5r(#+6-iXPbKIUOxHDPYxz0YMCwGSat_GOYV6=c?~ zVbu^>ELHD+XxHwjp>L7FhrubWly=i{L1$;M=D8fMdC|?Hg%_!(@vk8kkK@X|qxe;E zfi9!F8K$u>E})v`(#$Z<8x7!d9Y{@9IC~#*M8j67Gc&tGj4RxWX;LG$FXm&HGQ89e{Ue@1gi(iUFX zz2FfY?Wmtw`O4D#)kVZZZq9H!d>avv?Wp%FlD7C(pvRkQngKs-@NW6tw=7W2@UVqG zpOEWqNAoj}WFB&TkeC?3BZ3~kc#&!AUOPirlBo~FS3I?uFl@B-?|LSDBPKx|k1wC_ z`oWQq+T9ASHCzR*80+^aidh1|l4(=IN_dZNIsBM$d2kge4{K3sscBC52&vCv(|BN! zHCX}&)XRoiU(RV?Ol;ld>1uEya)RC0$D`ViVpRS(97%F)t?7y)Q#>lhU(yDn*kGP| z?mX7FPo^kg^JJsYmFLEPg(NkZ6B@)n%m=1XUZLC%QG zilB$=4VmX0({b7%>DAN9<9R@ZU}KmPh=&QLm_^QfUd&oCNihCgejjg|?ssHB=Hz*E zi4PAIs-~+R^68tZ>J(UNmJ-OjSRqNvsgmA)a^n{F-MOLK754t_4iI;Rj>%i(CnyJ7 z!43eV6N~BHx9Rb)9AXAeV5;XW(H$#ZKACK5a>t1wlX2I7LREipEk=D)1=B@GcW)qm zW7SkN?VC}KLCOHxviNc~aL*UmgW|}f<})kpU)5?8;ko)nSAx8po*4(dD2Ns?ex?64 znh0J}!?h`M6N2ETgSnLMsNBJ=&>GykN)vUUHKyL^Q0aN|2tv}?Cw2ZDkuu>~umw7x zg;S^M=ztG>aJ@ywEfC5jgP$LB9ZqhY*D(x8DAp^a1*@rsdByBqqSe!KgVMs@%n2i~dVK{0=D)2(c);dF2_p8gu;+u2 zr`uah62Xzw{(qXd|KkgTX}6D(cw`WOTm$i|@oXI*Gc;%6baRKzrVN5~U3joOv4&P0B_ zQ82JNUTS#qY+_H5yGL*PiAN*lm-dEO=h7wE`Vc4`#Eu*-hn7#fGp-*xzT1hsy7Ton z_-WY%#G_ed?iFY?x(gHu;-AF;tqYPV|;8VXrki?GgwcHahMVU!|n&I60t9VRJzv&vYVB`m<^mu&YlX+X$ULV z_Z!M3jqMT#+)ANCx>mR_X8J2w;Ej}&vXqLng3R?m|A{rdAQrkQFrV%?8`Yix5)K;L zZf!XTpd&Dbl@oq$P;t?T0eUXe@a!t#q$JzQ=15h*+KF*UuNo*0dY`T^9S^b{{a&1L zdqgc*=UmZ>p6-YaND5P^A2@GQgQYFwtu>SnRf^svutNkCgiqXN#g;I^L;g5%cc~Ng zHJfVj2PI-dB@)!SpQlMd)78T<*kGf+Uks+sB}3Ho+Dy(*u^j@T-Ya)pEli4KQ3^D( zz}l!DaJ2!t0)e2%PuJ_1%z%V~y_xERn4bHdYN6$NV&6FfAC&9#9eFw#ZBmx-1i_@% zj`DOZ9r=bkC`+gECCtP>80ezVr-m*S_RRDxRV16GhslKHtq$3#3-#3?ksnj^99THT zu)$kE$@Sqcbcj(p!@MD~f9M!I)r#;Y`Jrx)3B!_5= zKKOx6qYL_l0qC0G(B0}q31GO*F%+S@Qy8c(aWDSnaB}$jiUf3@8_$e!vkI?4*VW@2 z1<(4$%$4KP%(Ol@8C~89Jz(h&JP?f%QrgPqTG|$0jKhTS=)>d0Q(qMWkp#>LHn$X$ zHXc#<_0Wxd`g1Bfcdsa%xY4&Y5Y?jWrgv&|w({}J+SCSO=LmFZTUgQeQSy8+weZz@ zxw!$3tj85WSQ0yVHltZ8%wm{q5rn#7f71-EHoUs6AkhVymk#Wcj#D@MG<@93@>l;m zGX(|Ze#6#wgPxdCg8F8C;iz-Z`TU9r_X+!(M%ua-Eg5bJ&)1M@Zfp=8JOlBW@q}5? zgHf}x!%R8!vebp9p|geY_f!8Dd*2z=)VA-7iWL>eJ^eey0^?9Pb5Wc{6lL%y~by>fQJhtDD%7 zsI`x&Tbo5jPvb)fNfbSJNUbKujz*t2?NppYNj8brPwLi^Y`F8v@rA7Vw>2>W@p;7e zXucocJg>VNRfEH^wR%8#g$5$$gy9&2JpoG2i#{oH8!@M8(@1SCM@gu-V;{9RX?omA zIk$AbXey84%I&L=vfM(eVEfzQKG%h_skIgLbq+KDUz?wON;h|*Yce~3uh)1jZwtRV zOxD(>m`~%m5u#>f@jPdGMKJ0j!U)Du!5u%Ayj=sRl9cj>vKvl{lY z>X>_0moCO0#tsjbbw`Nv>Bj|lo8tf*;IfLvlxQ^A9vy1I3)JX!ksL$vdRRLePoI^R zhiu)T#EY^D1DM^Tyjay|^r->zgJ5>br1sHgd9N8!tk&z_X!DpSD4UejwWZGU5G z{4_C)Dtq(+R}g*KUdK+xQ7{OX2MY0y@E}-|dySH9K3JT@#dV!aeO&VVcEoi95g*1- z#oJ`zw|?x9UvxHIa7$thKFoW-La-j)q(|}KF@3Pd$eF0)&t+W}x?uFQJuEXpf5QI} zY%NSQgGrm9zZ+BLW>z70DYn4!T-EUmTL#c#i45@!mHIMbq7MfME5Depzp z(pDN2qYY-Qu$PQjDAmPv2Pt1)sZzI$7kGI|6(Mb_(TCaQ6(O|ufrSV|g8r;yPnw>x zscH+qzCUny&j-Ns84C_BW+r=XxUX2{P1(CNh``2coW`A!O0-PjRX-^_T9i5r&<{O3 zvjVw*NP?O3smtGU&#^a=Z31=*PA}b_!enED!lU)uxb`a=SCj-E8=~vK0thu@QqDKX z#ro@1#wzmZ5TtfG#i_@5z%ge4$H;46zQUkksXWW);bhT3E%Mr%d zqHny2{Y+=bQrRu@_RD|`NHq829)#JC*_6W3LZ@L%zc(>F;1GaU4CctlSaK3jkd)TwY^C!gzP$a}Nh6qz+-P0+1O{o%; zH;6b!Zo3Wan7!tyr1DbPWLN9Dbe#1&lQVOhGhUjx5?5owpHdvjTz=Akd2Vs9w3x|O zBVg*Cic=t{kU8{*+^@QVMqY-=ePA;X6IxU5r1{(2F8;pwv zXv;pSN@ezP8mwdP%A)MOo8Egu`|<|mTfk$^IAv0L29@cDS-ob`14HA%x3nlE<6$C16nZQB$0JPOafqu?65`igE3b%O zURXOPYVyN1cfrS1?!ZgDZFP8BOTOr7){{>!F>H=yJ}}tgVA+ms3-~xL(zNlu?drnx z3YG)W__UrpP?4Z`l{=xv-P6|R_)oq~s+Q0L3q;UA1%UV3|K)}zI@z&or6;+lA{b)WRpP-Xn_(#FK@<2^iP zTalp;V0uoTbJN6}m||=`<9E|e($3^~& z7t@jxMw=~)W9eT~`CNiUJRD69CQVm735Te!6@r(Gp2i~g44({n7{Jt5-2HNz{RByl zWU^3kHa?=BU%G@U&Uaf*-ZWQvtsvlsIcObM>C%&iR7LZKB2^K z6%&9OR{*h2)QBV$mj~sjPHckVPY}lK6VLLGKgPfvuUTktT|#BFPnd`X%zb$mvscIF z*IYKZU3VlMSF)BFi{CT+p7*}WbfhDGXT_Hv-vy?grP4f(a*@z{1P{@+L6+&@CNk(|> z%WBkH>cd>b{FX*Zs&t8Qwgzsk&n#S}GRjRuXBH}O{Lj98@U)CJ*IS#SA+EHojL zMEhKwojL(XPplirMu6K@Hxkr19io%7A7Jt=x*Z1`v$}+al10_DX9APi$QT8h=0UeWCEz0i=ksQPv*v4Qi ztVk8P(PWZ>kFGysraA3szdqbh&rC`D+y+Nkks0&{3fH7o0!w0z@whCR&7L!oa)muH z47WGO9O?anj=fR2t6TOyB?XgV0u>Yme_tqw?{=PbH7JYIfNlt33zpny5Klk?juKh` zo#3LR00fN55L{lZgjF8J{zM*OSr4L>ZRcug!qZXX6&h2z>k+GTORx&+$<9*{M+P?q zmXV^HLj2gN56J9QQ*vJNGGfx-YgH6WkI;GAd97>%?A333?mWIw6`0D;pU!o=>?|j! zA~$dM$=YOr=L%N!AgjNV;DyYbfts`v#3}}1SsU1NML0<|x(v`!+zp~cr>*c^A5Q!> zv}?gzU1IKPP&>reclflj7I))vX;~?K3^8E#rjEu78Gl&jQK{o>UvwjubsV~vgbk|Y znEtTi=rS?XTQnQQSTd%Z=%?$yTE3;p+VzF~Y2fR9*ywdkA;Dm=A0m__9d#k!CCit0 zEqi!>8D|0#p*}wV75&i%d2G_wL{?bH_;bcr_U-L zr;IkCnVJ;o@pXekjvfn5R!;_=Hr<@-T$31CA9Zh&DVPgla%KE}8-I9r0wJt(gsYWx zo&s~(Tiok=NkQd$9i$A0th>)0s*RQ%bu4rV_}{zrER|k_#RV-U8*zkEaa5HrjW`sl zamuWpbB8P4vv&2qx8%0lYuvn46uG&wvPacBR7UC*_tUN+?MndVSwyrtIVi^Y1@c6? z5ygLc0#-2Jj~RJUQ4%`5R{wI16Jaj+uttuGj5~rXw88f$-Gt6_XYf zjpnr=Xt26!*$KfMFLF*WbUaE_F@sqF`^E#(JizLu( zARojo_CF9VtQ!naNHwTn2y}6OTsp-akLorKy96!d6$Kg93>nU zimPtCV+hGscB$f@KXEzA3zHF$w<^Z7#!4`mkgdU|jM|M%Wvrz=lSWiI;gDSl8+}8H zrW84{W}`QHb$mMVF(`z4H;fUJA^0V^X)kun&NGkQ2|Nv1;B?y!n|iAiqxvcX z$}fOs^}CMn7@m%=3vSX5{5qHI?=A&2)d88NfUBPjul{GZ;Wdfh!<9M5$>OryYE z!>%wpKCv)vvly(Cl(G6ge%PR5NURE0P%>QC6Y3|2^cwz5Q6VP#zSw%!?{@?0cOu+u z6HbNs5JQD4Z$GA4*P~%9DNh!8T>4GBK=Ghgl|!iCaE@i}3%yA=OXZE|jf&^PM&>hBVO5w=Ij0Yz68Avf@fUy=(B=B1@qOR zBB%dlRGEQ_aPq^D9y#YROmc^@+wWyi$5+<-s&^Gq1+6X z3+P2213PqVup{QDFYq+_T_fSL<1;Bil$$1gfSv#c^O%XI%TFV2X94kg%V+PtJ`j9u za&Rte5hHx#P<=$MqC9B{9=ir`(fU#^!Y*(#$B*d_<`fu=n^86lDNEB5Q6@#vIZ88* zvbv-jyyR75)BnX3KEP%tnH404fnr;#{{ zy<|jze>*@0JL)ycre2}sIu4!Lb=J0WnH*`;fc~tn_tE;ZBP_C$b8fW+D z4%F&w?1%|hMP^Zc#6!t?zY-DzSPqHfnC<%t=$|tKIEF~wIplC$XH}|_0CtNdvQy*h zSKilbIJ0fimVVkEPc(xGc>k283?hGB_Xy#>l7M5Z&<=BuIw!02jwvL}l^tmuNf{2^uOG_I?G}2fB zTqm~H*w&KNj00ViTyaJC%O&H>EpB`iOfrsa`drjo^#LuW_nFR@cN!Z?kO+Xs_H9m2 zYYu5knHU@Q_`0wNoWA`iis-`Fsd`tQY={(_5tD7H_Ay&Zgu1gjy?96WjOgsI)BF0R z!zGU|r|F%$+%(VXs7i}j7nOT>hMUyM)Cb`0R~ zUIsDAt7Rf;G%AY~j{y#U51rv+gImy{)nd~T<(1t@NskD5@z~GfDdBbDz8E9IpSLE# zVd-!lFu%@!-kMyyBeL{9%8B}pWBMN+srt1&l->i&O`1C)BgtDcU4!`65JSz{%2Kjt zu)7v>k8W`#d2lT=rd4Xl-=_QrF>rvYP3WNTSOmROhi&60`zWzcW0zvn`!qGIv8(j0f(tSK_@Kzx`vL%0Sjs zA=7d&P=Zq$+k6)B<8=C8L@lZ2 zn7W5fY41z$iTtAbaw-OB#&DH6WBFg9%e=pA(lP;WAkBA*9}bV4AkYvRBOZ< z3eF^Q($Bs@(<*t-3i=-F_QI|?(NV1pwX(3mHs}s180t0{pc! z?%fXX&gr9t-&M2`=ukkR-+BPNGOrCtY|qdHQB_ZOju;`LH2&+o5Ed#OFt`9p+-~8~ z7n%@)zY)(|f0|MO%-3gE@`sV)Nk1QkAGVUHoU z9qm@2p_T+*9Ve+Zrz(<oepl9X&IY|r}6`PAsR`mEs`qOho( zPoD@5(~!d9YvauCPiF1(F8eSgz5m2t?Qxj$akv+9kpiJH;HSWB^@(seDRHLEyQq#B zFr&r)Bw4NBz*kL~&)J7G3BUdDTnOhpaax=Yd{h1917Cgsnd6^Fxd6}?3Z9ZSf`PKG zxz7xHB#`o63?%w8w~XwBxa|aVCCo2sIkVL=wZ?GSpfB*Bj7AB-^@7RUlQ);jHXMhO zQG&Kb1jSAr%vq#F7R>~eRN<4clrK615Opfi=e1YkroiF5wDXh#R2KCySrehuc)(i} zZ!1*ggXGhn2I2O77#hCczVV`2bppmfI|m?%PD=aB9oy)>1V6Y? zPsgRc9XRFHi`XBBMPd7D)3$5m=?x|XAg%ej_QX^&mVv57`4YF{nc#P?Obvd<&LER( zeM78pJ<2B04SN2X`_tfPQDiy?!;>%>DV!oK~=A!B!UBa2G>jqni)#~vvNg|6nFbN|cJ=y^rqgS38hzAf7xVHKt84G;R{u;6mm9%^HwbvXinwOb zc>7AMBtm*ax;d<|htWje-l@jE&M+p^+C3+y%MMud0kOAFfLi-(tu7B2Jd?PD@NR83`K|nZWT9+AsTESUXingA z!0JOf|9kYu@39RAG>Ncf=oI|?sJh%5jyNRZ&;j+FV`EEu3`aS)K$cG@SAc5#+(0hC zzEAi4z(3zYYZ|UGyhGf0%gq?%Znu$EQCn3Lpr~AN5ZQHTGW&er0vSC=Qs2M*jX$j@ zspgJD!`(cUZzkhyIT!VT)z3@l&7bW7ezyqt`@`aF79f$w0tcX3gHAa||^+Bdbo2U%m@6;=Np?G4;s> zF*}?WKa&xdzaZ!~SlhX*_R(mDdNN%iSn;kFG^bHMbj5KTPpOclF=^1~AU-LD)AHR)gpNZUhLRMkqdGLaB3f6u_LM(mk!L5nU`65q%|AR=cVAMAh^L#9Fh~&UaIQ{ zyT5lN=szcT0v!p(r_Ntz-awSp?gq*We{mk_^0I%iG-1~I5b$L0`BTUKPx5Vlm2vya zPrm=kEmaM8hJ_P*qF79zoBKahGAak2taak+f>-SqiXI)6I(dymygKQ@CrYu*K(rr; zZ(OMg+hJ+v@Q^M2IrhHo>iIAC@0rDYyE{v6D@bJ{c_dF^6fk8S%D5;s$?q-}8lPS> z)D+)bdwptNVCo_Qn}+@LD4XTy^_7>kWw-U$#I1D0u47YW{-Or<`dl-KgPIu4hWdFz z{TE$dbwr$)M zS$cCbq-^RZ7Vhe(+I4ZzrAPE8i62wp%8)WU9(G67uJRb0|r?99o+hgW}uYEfh2j zV$D;5U&8&M$ zOSP9|zVE5=w2%Ylat`p-csInzVkRX2ui1HBx#W z(gJ)TnpkQ8P|_?%bsBa~lAe8K{Pv6P__~25uq$TaJB~KCdDg)_Y>Px$i;!-$|DHq0 z_UU{7ZHJJ}N@o;PnT+Vjr&08uCC;Y#q_^E zTe626zlS)R<0xPt&|&yX+CcBjq+ETQ_^Y-AVS1|o$a~7008GfY-bgkNbRzuDK!?35 zi<4R-gavF3i2&n((lQBRL5azxiUGJJze_9d=>VXdI#lOVWMAF#xp@E81FS-15`jSN z-aOylQzAXX6P%9v_8Zs+&*AqITny+ib5kVrd$-N?nzM)c<~MW`)QOrBWlejJIV z_)(Bgt?W1-GgJ>COW#V+(g`5iNz@Lo7rd1~?=#q;C~N?28r!{~bo>3%W2u2>vTh0a zd-FqU6`qs*R=v8}pR&3N4DkBZMwHVtU@D8}^y$cYLBC#$D?fG^=|?J}6*+%WB}w!y z6XvRJH7a2b-G(bGe9^VYocMWb!}F|LW<7v%=F~?Bw;}`bA&@+V)Sp?NJU^+^uXt`0 zDIA4ju`nmJrEAlNb>tHEWh(fbh&8wCdp=whd@X{~023L0(dCu{vGNm@awN3s+sCLolw$x{GM@|qkk>C2gjV!PH3-vP zRPmrYh-q|mY)mStsK)bz$e8K+TX?8V60yxAvfg@M`&usQ+hhDxoS)oLH5l4T3C^Mv zDE|;gG7x#}>Ulch!co5bO)>Tw2)H=g^Ou|FokOa>t7>d+vPSo!DUSfy?z?~g?}iL@ zTZKl6skj!5!plZ|k%a9Z25H}yCYCbm9}~P~v3VqbJ=ZY}2F5y7h}MmSP1- zQ9)FDARQLH%E0@AfqavIO!Png!q_-|FiC7RL_OmDsF@#{1er#!s*zo%TU){<=%FSK zig$m^^p|0SAm=xv!A!=mdg1ss+HlRJmE(m3gS)*8n+Xb81Pz85{B{8C68<3kFSkJk z?GpBHFLHW5NM(qKjO9yMgidsrN>r`nf0dTeZ#7u1?pAQ4m*(PkVJpc zVbrKsA%A~mp(r8Rd0TqU!g)xmBEP&2H(H!^|2>h7XR>Po5dM&{>@`J`095aQsS-eG z!P0P`e|qKmi_X#tl}LunLwCY_JMW9S{$XtYFwjE=9x6WU7u~IcX2p44HXtZD136MD z15<%JY(?jvUmXQT(jd*K556zZt{20`{$(2dZBEe|S^)I+G`>@@Si7np@ejx{efir~ zM=5C!8B^#FJ&~mHZHHocPz!c=$%wO^6Ylb$}fMWP(HPin|KdmX~ zZ`=}*Q&D2J>U}#1qF{#RsD7nU+wy}~&OiK~<*Deu?5{on%A@vdT-0{~|M5-WQvLA&?gKhIVdzd8>Hi=8f7r=!BN)WN(xAO2#-^qt zgao*)&l>blzsL**hyA^WF++3oO)?gRECuoM;qgU-k^YJu7 z2=f(m65G<3H&+z}o`%1l8wHzft@H>SJMc2Q3xL{q*w(-Ue+ddmlOX%udeDG$!Qo-D zk0{R#abZBdjT*sa>j9YWC=)eD|ybKgBQymF}4h>aTJ zyGyxIggEHX05DAM+Ju5>YPId#=OyI8g}2YvZoZI7DACF@F0QO7KU7SVrv#d3O1?ew zZG~vtm_HmbIy5d{jRQcNe2B;(d?axaV%(qjeA*Fr^28fI)WWGb@G-;AzL*N@Nb-`I?!o2 z<2b@r+cdFykT_uJ!(i#qop^HL!dz}>MhrxF_VyPCHfe0e3VZ6+J~8;JIA)_zB26ImIBS60wNKVfbk z#FV>S@4_%U_##B^(xK^UrB+9L98?S^lS5XT0XLxn@#m~@~L_IOZ z@WkRXGl2Lo3-mdf9Nrj1eG&atSf@4Ix_1H~2`L?)~zLbUBp^Eg5VCc-0$!WkX4E(leIR=~%iuM2;|b z3I1IrGG8>Aqjf@bfF=jUSkH)R0#JIhZ~4Y47uJR9!p81KHJHLaV1~O&)j6eR)r}{m zyR-!t!kzPc`D(H^6v|8NdGIx5N0xb;ZC?AC8K*WDyr7G|$)ud!I8t=W1`F%}5+siE z)u76{OGmCP{n(i5H<{)#;Y#=4H8L2Qn~CS;eIDN~`R->kjQX7NjX3!lePIV^IF~-9 zwUgGP!Ug9hN9NFN2JVqhzQ=!>`>1x#dw4-&b>s6m@*E&*e_`2zi_8&G*5M1=4X^3j znXe){WjNFC@|zD~bWdrla~;>b`dU5zH2Q{NoDX#nd+16vswQ{G9Xi`VNbe?=tF_-2 zBCk5046u+dC+Kg!&`7x3c7sR8N}}xiyF1@!98}d#hRkLN5jkup)mSI33(NLdWle7C^lAncmXv@lvhQ$nl!9rB@f*ddRoB$i zSBCXXNY_X9X{y}$EjdSZoO}KGSvpYAPILsGnZ`xY+pQ$Y`w7*Px)xqL$P4B|VL3>p zfm*0Lv7=*uR-<9rBtmEWLT}@VWGHJ(&Cl1$m{fT_Z9NuM_YBeNW!0WxzVIB$#i5!c z{U+5<`dNgHHbuPGLA+T{80|L26%cZ`gcKt>>ggPc*UcDKMXTTr<*~ah<-y$_;Loln zTXF5TFMMvBu760`o0b6ZQ@`lA6opU?CyOZkO}ZK+D+4m}J|sl?aNGm5=EL*uYASto zf)c#a>=xqr4HkL;_StJR!AX*NLj(~}yRrjrlOYx&?-drW6zE>~zCE3Gx;~ z8^eRp926h6=($2+mRBVXstW#9nn!mRmx3f^!sBpyX0W#$X6rI4NM)p9ESv znKeF%INdUFiQJruzV5#~^I%8}cO8?-|4Ply+`stp)Tim%)4Nj@#dSv&VC$bqi!T+g zqbdqCn9XNa)td5bFqt2fkoC`Xye)gESM$D*_705B77y%wu$)716dTJm`<{(bDxerH)1bK5YHoa)a1U6T}pZnIIWM| z26QrAq{~Vl8KL^`nftCJ^ZF<7P9`l8Mj`r1fF10Chr=1n_4P@e;ir^EE_Mp0%x z9(MOilv)h`v4k7OA0u?h6?DSFF{V$`bPM-y6co!k8u#iLfov&2mh)&M08GjPGLzYJ zialfoTHxd<6j2jMa=x>TA4P}Lv;p;9#Xg}Uwl}+|5XiPT)Hvf)fcX(#81W^8uhld)XC2?Lii^uJQ(RM;DHp->GB-7#33E$d0j2b_9UsyoNJ<2}FtIHtR)nn55REfB z#Je#W%WUVtkpLc*?fjDd5ia&)zgt=8cJ;Hnk23ByKS#7L>^jFa9Do`im%!g-dYv{d zCT1Wco;uznbh*-pWlv0eqZz~syYn!~^52?bfrwH>iRE?9hmuHc3O}5**CGREQv^{q z)CYG`UcfJoHD-(?Ydtl$=Wg<@X%Q1w9Cos8XudP14u33fubg%ln7qKAcXkrkC`Uz! zsfmCjNzy{3q99dmux$MJh8BssS8m85Bqvajx_)q-z#viboAPK;W<+4Ln@=AUjv@|bFSn4e*y5#O7Ckt~MQMOlvJ(BSe-5!N>Z7Wz20Xc=q*A_R5$)Lt)1_XMF zmIco-o$SCOOdk)Fjl>SI$Jb8`8#ouA3o?duOI|sdbl9E$~wFw#>^?T?N2V-t~}*>Q^sSn(0VGyKlGX%IdaM{ih2nQFcSRw z(WRgWc}GwS1I9{iSbB(@n&>-~E2Vvba?N-UzxbGVGO;(`T0u6O~x? z_-sW6vRDq4*=M@q8Z7HMl#17jlyuW&}c9(?gp z^lL{j@hatB4ghGfd6NTWx41fSj;zn}~ulT4Yn32lD5qfinSCZ$L!vV5~F9zjmEx>X%<@CpM zOz!pIPwIoI49Cun++QDLTg7?-at@HD+1)|aBd7d~8nfOZ1;_L!L%uA1HxyeZsw=+2 zPpnK{*pTP-o$5I|K~d99(hRS==zDEKOJ-R^Se98nVeY(B*FDK%5sh~VU|DHRjiZl> zJd28q)ugrP#>o>S6u$!kk7%UivvVQ&*ptGr$s#O1Zy+{FH+Go1CrP!MO5vE6 z2$XOGU9vl{s7befn(Wghr&AWS+_!#bP$2Z1n%?3=wys5ht0vKix=68~QR}CH5Z7AO zs>}QvU_8F3hD4!`pA$4bzsb-)XBA~^?e<8f;PEQmO^x;Id6C}5(E=~~fNplynY!Lj zv`c-~WHav-sJAOD#zflRUTEY3!L+oX?3x*zDe>8hs&66}B}L;&pw%i;57D5A5FAM3 z1%Qx=n-!SSUiIJXeI@~+_d`9JQ{d4&Fi=Qko zD1+ii@@ZmEFii}hxYbxM^1}@U*zM|`tMGQhSh208{4ltfuAXV2+9>kn`&|)69kYeE zcx!YJA05TL00DkTah_7(Xz<>5&09?1KABaXoSXO{dSNv4#XZk!`6=x#tS7z}ZHDC| z@_$5^z9nd9ZHubG`BN#Dr051beXTHGz!d&G!l&W>Wl8zoC4zYJMYMg?f_TIA_^0gh zaS=(2cIhQ~y6(a~I^&@N@iB`QrvNK3gW=zOsM2sS1MN5X*=IPQNdfFejwXW#^QN>V z?Os21k|>Jl;0pj3DC-3D)99|Jmmn=?G#O7oVeTmYH&O-kOe$Qlu#cv4R*|P~w$dNc zX?&#*i!ejqeD;%j!0<^2Y?iS*MrfNnC;sYY}y|eIestUX?fq zkWQ(yO&G-I>Su|Ygmr4I7Y@dyN@WN zb&C96;JA|L`FQu6Ij8BTX8f{Wy%+3|wz-uaCIXD~_tF00k?YR;=)$!IpMt!Mit_Tv ztR!Pj5#=z+&L$EaT`cT1poXLfIsT+?|7PTs}Tc=g2fRb&L^ z8Bk-K8s5i_ZJUVj$~_G*{NlenWVbF>WMyobAag!8<9xx5%aY_1Qg!r{_Vqv z?>;3a2MG>h#O-g5n{OOSXH~!{l}!jkZUG7 ziW}mOyH{A>QN2bNwFR%?BtLq0~CGwKn1JmT{6h-C!Fv|`E(#r9AbeR43n zr;K1G)b@Eo^6hJNYs=W8toKt>pDw#;G8jl5WrWYIi(C8fYy(blo3F!(I6YB&y&tH z1UCC00#p=5gxK1^c$_)`p&EGXTT%H}Id&E;|I`gm8tD+QG*)&oqdzzDBJa{yxrcP0 zwiWIzJ8y>Fcvpye5%_W|BN)Cu6LCAH&bYV-HJtk7803L#D(uiC9%xI5=Durfx3;Q1 zS{j8eEVa(cU0>KHZT}v4{^x>kY2Tmw!B%(_QlT#bPicCGzT=EJzC|i6OE);j9f0S)QuUyjoI*_OvS`K@?2k`w&A1z_n_V5CZwg$}T+?t;N^ytPi0KL)41uzrp zf1KrvkNz%^SzuCv{3m1*c6f7g@3CL_rdrPsjeo}yxbRRwG=Y`Q@I9^18zz&MHr^#1 zm$@%1!~FfpPht{OEW&y;JvizHaqK78r{k*2JNDMiwVto!CDS!n!=CjHi%gLo@;19a zCo?h{NbA;x##R?kPcql?W-g^3bCH~ZT;};**4D=XOn5?@m6zfF*y+^~aTEO9C zx%bM@wy%Vd|D7uS`m!h@>%r@(H$M!s5@u+5I^DxsMjrvV5z!9>9g0O-r);YkOLc*s zr1p_#=C8{4jkaBWuzl12-q@QxzaMuZ2bXprntd2I1w~O!QJ9aMk?K#P|Lx1p(GN1{ zo`tpYh9Q!=vkI9E3;=vcW&7ViB7m^zU!UItM{zs0LqO@2Nw}FvLLV*tZLv zx?RkT9th? z?h#Crq)BqC*oW ze*5e56D_p6cK)a^kH}n&xg`QF3x}(@-2@kqG^_nGOX6yJcUM<+qxAC22>p5yQhl=3 zG=y>KK2Q}39T?tCgmVYfUw>X1Wo+{fb#DKW`WuIr-K@6K%Lm!)-LP@`3w!x?BT$t1na~7-j1WzHjJNHg*kg z(4S%JLn`)T1SlPHi%})eB*hekteMu%M_ySKv3K7r8q>R0omfBmY|B$nO*VW}2H`ak z;GT%iTDhd^Dd0I2Gjvm z0b<#KDYVJU5={VZchcW)_hRJ9Uvz>q&5&KXKJa#i9wz^fD5JVh(ML<(ckZLlF6!&3 z_*QlQ$1Ug&;N^b>DHjd5DBkL?Jwfb6iX@p(a8^e88hy$#_If8LZE0hHzvKb zraHgi4jmHEf6Ss*W5a5l-4)`8lBHXU9d9Ohit%XKcV$AGTIOXC9XIaE@g`m&hJ3?< z0C<4Me#T>;)c5~fXaGuF?OGvv1LBSA5QKJoDxbrUhB`!1PYvM2UPc82R?s=xK^bg zK|8x*nNNK|f<(%@lkZG>Hp}${!^L`n0gxiIR<=^k(y+^Q?eY%}4vxr`w-4H*@5R}E zn0sIqL-6~FF7XToJL2DP2RGu`CtwDCpg|{$cu{wvl#bTj^2#XU3nBGch*+xhd70Uw z2mBa6R8%w3eyA}=Gex$imqUkbWo6y=&4k79G5K2|Z z=EFf$wQM9q|BksZ@c{)h&G3EOSK~7YS9$o5o$(A_Xwyr+Qgt?#Eut)VFU=4I)M9Ao ztbyJa6>?G@H08_xHAy0x3MB!$Z}pOcxKYs>49kQ539;f#cCwiYf9>Asxye`b&Upgg zy?qRudMHAP{`De=@EMD|T-bzE(B4dTfHe_gxwekMPwVB3DwEGR$c|RL7r5A>MSFhJ z<#^J9;(b7{?rQA`a*htJs+b(ygbm(Qn^LAY`T*;0c^35aZc$JK7vPz!Qn82gOF<4NBIT{#WAML({;f4Fg{i17w=lBX@4l)*^PocgU zgY6i@(8Us~ThrPX0jYimG`pe#VtS)-x4go@umfP`manj=x6zq??s&{j{aQ{;b{;#}WGtL^Gr$GAqaY%&vRNJ)s?_c%=P?FkB3` z>J{CD0#Tn)Mh?xWprh2C4GxpVgOuRlc}gf5{FEd->ZV*<5jFMDI-AgG>l2a|>w+9+ z4vxQemr1n5Pz3;$93GYUUG*FCyHB=AoQZ^dRXjUfdjsVIEu>097$Fa*BbmqUnQBZv zO`r&n+gMbD(HGF~Y0uBKd%GpUSEZ-n=l#Y@sgL{RA;Phd)=V_YpgyuS!8QCr;rmee2`*VdEpsUsON#j`f8$u9cV z^Ko<+Ht*Rw&`B-;l3@k&uJ+r@Ga~vKq$)W%la(J6f%^&@rXKa>Kon5B_52^gfd3-~ zp87`&{Qu0x4O_?9*s{fGN}_L(>7pm$C>4`!^0SRM;)lR)4_vInU%5}UuuxoE_51DZ zdo#J|)vqe^h|8{x&Kl-M0M{jOFz**#uL3!dMh}Hhlhvr=7;ReUMg*S3{}|Zi2t(<0 zkevV~YQZ{cUadq``;YH~iSG8OZEd7Au-$PR0+QWBI9604XY?Gz6~LN{mVaTGN42I@&X+1+e2*};TNWH807q-Q{HQVP?)k% zn~tDA9sy<&1|B-EwuuE=Qy+W;UIKga@&J$krBXToD6bTjrj_x>W59IO4!(uZp6!9R z7+*%9Ddr~VBbG@n)RZcan6;Im{&)b4{qC`%*fSD4w>=UjD_5nT1;dX6;NMJXE&(gFqdsWF^p0C z`VEriCzg8-bvN&&mDkk4Mn7Bw8u)|s{iXL}b<2q(;Z=g&#!(u}i$!Jzj;2f(H8K+u zsds0zgk2r~mVE=4-5&#VaspMRv?>8w!P%_(J3oN@`;U>`Ypt3^3lMEs%2*jL85~{g5qfJif?Q`5N z$hDF@S#?Po@Hz2sz8ZbD`p4~wxA_4vi$h=@Bu^eiPj%R_)|?m~$=GD5VU@Xj+y09} zcHXOXovZ#&M+IY2j31>5#9uidMr|(_!EtolXWbwSLwBJHe9>yynB_xh&kY6nL$B0e zKu%@yNEN6lut`w$5Wr+xpgsCu?7e3|Q|s0)iWLzMkS0Z<0wMyU(o{+mq)U+w0ipr| zVuCy>2vza?(^m>C$%s|p{HUldy^PA<3Xr;CBhT)o22VblHT zIyJ$t`R*ewDvu4jXi&ZY2KBbA6mJ5V-skIuIN4t3{YXy*)u(#A9P!P{A;nAT>@M#- zs3&n3xYF%A4Zu=R6Cmn%OuacyH~<(l*ea1*Feh~RD)chiUF_Qsrc#(L(d&{ia>ON; zJ7!*wZrk!EX23ZWngwN%gYhoIB_GqOC`dERH2wE~aQ( zX&-yqKB>64%OTJN>LHd7IPY8mN$~nv*k^95QKK+h3eQ8|aaNUY4Y*s$0@|+wQ6nuUmTVHEhhWurZ>Y&PL`*Dtuhg~7mx;%cci}CF zP^ZzLkt0A_1|VQWAwKpT6}S_eZwcI=w<-=YEjJr3Y`oJZde2+sU}jt2nw)!1=#v~t zSu9zoNrje(d5X@XJ5J+Y5oFs9z)|%0DO8a_IykaF!k5*iq)r+AL}#anR)uGw8f(g2 z^St~I#qSFk!6Wyz5M#s=xbrpI_|iQ0#WDF-_;RA_-3G$@$c*@HrR@ED2cuvyre0gmOXd&t7TnV^>wh1-H_)N z!`>CG-B~ayl58{mNS45bZn$PAX0zJ8b2Yp9twq2-!NgrYrY3LU4z%#S zyPrW;1F>k!lYrQi{yOjK=)Vbe_=vY}hlAMSH2kNq{Fv}rZJ5Jo53)hyGMhm*inBq8 zhmszHxOaD|vcn7JuQMWEll3A|%jWq7b5)a+(*fA&b zONQ%z^Pew$_Wb2B>IgnYa|O}I$kMHo;0ox7jDyywRAb@Sq<`&dYK4$Z30op6`?gFY z!M3NbjKl?n-ffj1573K3b_W|bPMH~8y5LP;x=_m}(3>Q#l~&0#yJzJK zCU^Zg$ui@OjgbO$qL2!ir*wktiM!J%YeS@)uUzDVB4)pwTM{#Av8mxW%UDGJUYJ^b z%b|tEiT%)rxRS}r$ZAL+e1Lg^5Gr&Ui1EoCoM|Acbr&|b>gcJAyHk{~cVHIsbph8$ zZbY1DK3^UHg}~W|Qa_h2eqQz-be4aKlXQ*7dgZP;&35T%mn(RV#4W5M%;0ay!BPFN-dGwBE4R0L%NLg~T$tq8mgzoHev@q*i@9r!ek+NuLoD_vu z$^7PyCZ=8GWDk{j$CZnmTa@F1ISu%vIbSku;kWPB9%p*fb;hL8CE%ntCt>*7v$p-` zUA|Tv2cM++WS_9ez%x)1D-fPOqjH?0NjfdU(NwZG9a?rH!+Kw6`qjkhv3 zjB>A6!Y#;{Tv-svEQE}gc4WT}G+4YEJfJ%6WUm@|{_{a{#Zxj4)N;5jfeVH1D`JMT z0U)!pn|{^_$GC2=ZzfSQ6fM9T57DX_6W;_>trwhZjy#A~?N&NE zW)KWN2;w^wu2JQ153(?L!E?ta*}Sl~aBCsq>oKt}p|jbJ9*?*Y&4T;nHuiD18Y@iI zsS-{`RdyqW<(De(KE(uOb=9!9uab-NSGqN)HnwmtiP$`a(5l0j!O?>%0w`pyLN}VP zhcT$a6o2R0prR$Hz~^D`u_!{^-cVRGQESadeZs9M>cLnq?kW6`R~DqdWFr`mQK-co zna6R0Qc@XaJydAs0Lpu6LZ_#7VO&qaFy7RnH7zq=JwRtjPcYB_$$`#?LD-o9ZlaLr z`>8Y|g<^c#w^!X*QLdf0#kaQ0u1~_8T|wISXc)3(3pxg0Xm*BDxe6xCL1aAk5m|J= z6UQ>(BqZD;`)aVF+>+kCadG(GfoGb8FBkV7bA41HMrUdQ8|M@jN-1`qs!jp{q+!4M z`_d8FMG)4Ru8hFki7LRP)-chlIGNk|oQr=;wC#)3+Q!|VN8s@#Yl)##8Of$P*Q3jx zn;^c$7A{tphf?b5tR8xG9W`ay;HkA9a6zN_O>s_>p&sm z#Dqmf=d$$i5?z}scXPUQLsYYU*m(jKQ1v7CgwLM`j?-{Oqes80xO{E3isW^CU+SH%`3ph|F5BK*;}})@so6Q;D%VHo{}gl>avtl)Mh%KvlC!We<1GY4NYtN^jagKaS9^8P)JjzHeao_l>}Ol&~s z!J(lsNA6k8M37Gb=EeS+P!ap`rn4Gb>w&jR#b&bUgN~TLRM39-2b~3dFnB%A<3Yf= zB|)SsAwNQBt}e6S{QJAz__hroEPeXc_o-oaaYyzu-;d$mumCfTGiRBa_CRU(E*;j9 zn&hz17@t@me}Gio-j#mWYqmR5->rdxPhzI%V!J#o=OZBZ{%HT!5p8k0a3M8p0otZ5 zf_atvlY0=Auz#JwWIucH=O8U}XFlbE!8Jj9;%xt{Ek=4=KJef64hp7<&~WRxT^KOA zbVSL|*CSm!m3q0j^LY20Kuv|SNfN%P@oh#AO*l_14zxZyfiBOx#R z8r*pOk#_|iTa*5+B8}Lm-?*yMuu|U{JTqnpB4`?N9BKwukG&Iq>Oyvh^Qefi1zCBO z)v}oL2T-u$qV7>@{0#Pqs=E+br5e5a5?*n!B?;%?m4WFomz?{0GG+xuF@}gs7ZI*f zcEYVF(P$>!2BuxFM2Z87?Okog1jmG0Se$h#>|mt1Yk0&VpIThu{sM;!ANx}BOS?+g zR4ncaHRx(JRX^XK>=4U&tmNDW>kr0-p&L3YM?rJ5l7PrS&m3m65?)H>tM$pLB;_aa zhFal*Ei5yEnqOPq3$rkv6@9Rmh&T84GGJwD{EA)#I1Ca;$RI0jJn^UR^!u)AUxhlh z$ol~$!LG72CdqMK?Zly>b|)g<~zWDbRiVAxi>(ER%b|er-m-z#=^7%`1HuzYJ4y z)_7WD*z)aeFI^O3{nVSCYeuSkwf?I@joQ)L$Vr!vY^n@SO&a1|UTp1%9?5_Z`MONQ1N6FnY6E(KN{)P>=V9vyL@>| zFwU@I0>wNLm?fX*h`_74h!#> zxQRyQMx?Q3mGaxrV^f~D8-T;Rudo{M03m?R>aO-!u zqyVNAqlx;>0_U={3i<8lhO~6?<1Bf$R}YvU7myN2W#?lOo>t|1?Dhr6h6|{=R0Zlf z>Gt3Y%fmvJ5U$zTw+WwDs>1XzqFG>X^P4c|A@k32|`rpG87~-)+yO2 zd6#WuiagD0JX)8%)OhgqIgyyJ=D*SIQ!1#(7DH>GyQx}W5ENiQCV4`Wf_=sMp<|h< z>wwJUyFG9#a$)&cjK{KGsw>QW;v)Af_txsZ?+i}~V=uAABae~Daoj$tVID0-WVR?7Q^m zbGC)DPp_Ij7m6cJ=HOaAJGL){QV|rfM`$0i`M74?DC-@#kjjO*ZRu+1haXTG4f-QW zJ=X^Cp$-vq7QAh%1F#D`cOpcuKMUi7E;a+z!(vAUaoMKzR3lJ3^Eeq+M`!Cq>t%gsaJ++KmxC|Z z>>oxrenhA)H#;j;)IAm6#S!9r@O7i)d5M*0g|H+!VTurD+#|5Z-O{&p%4aom+aX5PpL#9yPKJyh*O zkz{0T{D?3`sM1$?G(?W=pv4{H^;t*LQ7;)i54YV-5?6&Z2lVf8pU;gySU+(*AXc~Z z;zD+Gco$;6BDPp2PHN|(o>c74+;ChXoS?Q|Fb=6(WENb|4c_>{28guAnV0o>Wevt4kbZ8m3#}6Myh$Q=^}jy-7=Hb-At;^9 z2(l=umj@afA*>jAR9GWM7$_jUy0p{KG>!xGy#(41&fjOPuQrL4aJ6s28W*4}- zi&@FleE-Ked-iZKQNOq^u)9l^c0qVURpfUE$X8wX`lM^(RrqC{C)Tca0mH>$6bud=~t^z z(|}OWAr|EzEjn{V=l2D)Wq3$^+yj`T?%&f{Fj7^A=RIH3$Qqid3Uw&T1<3W&=~cnyz1w&aGp z@`=z@?C(GE_h(#uDz-{zqdxx6_5XSNYx_Ts0O6o+FFVOGV|D{OD0H$<0W{*vt}@3J zAQNP}5Xh4QQZo)OvJfM|St9xMTrUl(!_9Ymu2Z}=H{ud<{0oc%y)YLZSJA>3UgwWy}`#6I#EjssxAWgZ=>D_pMLveupeXVT(liYrMsHG!QB>8P3b@XX|QADlL+v#S6H^Ht0vK?~ z()M_cQukW{mtIO)rKuaGpI*GXuoSVJ+tBLn)Sg__-aiQD216z(YIC;x$lfXR3lRs< z8bm9p!bZ5({;y`_d`O|B-IK$v2QS@vhc>0fV0h48@p@PRvbZ={h1TcOoeJb4vl|FGGzy&Kzl6-G|p5$|)5cfLHR<~;pQ zT&VZ>_{}?NkP!V+atR0{B*%lskmQS=dv;@2F z43~$&wSQM!*^~XWiSi7-gJ|}t$nBsr! z3TBKRG+VomE%{#jQij+%*C?1$YT~Js8@g`r>$wZTfPqhspCaav4YD+fKv6s*efJl7 zC;W@A4fmgYtmbwcVH!+1f3m!gdQ_cg7>_H0c-&%YWYZe{gWb{rI7) ztK^%RwxM~nH{ThqA-*##hyFTG@>0Q@0=l0+b|&kW`IP$WJfVe4gA?m)&)=MOsb4$4 zGvIKKS#{P-BNy4W?U3IY(AWQR3gv(A%|E8}|LZgV=gq%aA^!1D{hffNEr2ix`X?(0 z?(fc@e`D(X-}KhgvRE8=gQowbM)fChGPAD+vyWeZoKt&n$z5W~;7>DYJ40f1l^o5& zEsK9vjuPK+Z#rUjT`+#v?qZAgSI-{mxGbj3rhoq>Iwkansw4Ez)n!)MHi{&Elw7YL zk9_{6(RZi2xVybO^0W8#_Swmwtu4$8p&yYy%R#pjuQ=1+5Js_}dj%BEnM~!Xgv@vv z&w(WqbU)a7|0g}?|Bc7Z8_YqhhutxvcZ1Ssp7W5 zLnwV}-0zjq$ar5{!+?0IAaT%7m{Ua(ta`7Hcg&!T2=+KC7lgIOo(_Q%RYKQ|H+K|$6?5RRxn&Xb z%0B2G;_J}p6cSMEqp+_UhpFGm6Yt|=qS6hL%Ag?k~|AAWB z5qoT*M!vx@ixi^~E43_awVe{HQt=0r0f>F;+k?%CLZA}wlMNVzZI6(;Nh_!=o z4ivIZDrZ=3a;`YKyRL8Y47&6f%JoT9fc@=Q>(F)Shfwl082k~Golvr{zIRdL+RSB-6c z{?1<0dTs(=A_X7ns0p-WpTBiL4fk>#4jk)?bxB7Cb*cvImV1FMpr3%v zco&x;0%Ld*gdPheq@^ck@jf51J#x&;BvdXk;Na!`Ssa3bc4FGay^914K^jmoUbYoq z*P$C2G-7L~L4IVRCY5VWPne`x*LtS0dh~D=FEB9r$@U~g;n6yT%W31fS}xY1;manw zs#vnthT@e|q1#9JCZY`DYVYw>ouv<}oCP>RHtHL)LcOjoGaD~jm*O2p%3{5A^l}(X zV%X8l1?Cy&#%}l_yJWwHN&mAnlk_V>mSb4p7y=(CJD4D?NQk(+)Fm4t5Og|Etr?P`WVf>qg&fB(@V%w(qu8dsw{gC2 z`#61;Ima1E!@YwIeU&^pLjO8-g{8A~uY0=B1Cu=!_Ixq58ay@={tDX72~wV2!(KwU zhQ)DHg!cG2+Infb6Xp;QuybM-Le8%OY3u{IP$gax*m`CQ^wk=ZG4U=LK_-^!t&jV! za1WQM=U+aNu*|Q1uXJROU^plJ;4q21Ydr*QNnRaqtW6q(?i!+Mb`^s5JkG`Etbru0 z;-^jScd22eQLZP9d3IdlAK9-?h%yYBZh}rmCH2^FuTBwMqi*P(X<* zbtE?%gLigPt4wvRX3#Yo4G!+93}4>ClM3Nx$DWD{ z*I&%#$;M}~tDk<4Nb{^5K7H%!BQ3Cq1kxLkWVT1^iWfZLOjJ$aA<~OXCyx7;ll$V4 zvS)$&jpv7biCX81siXce)o zG94g(0woT{8iBBz*+7h5r~s4$lC@}TsjkE;{otT98m&n8#DXo2S2V&FjGA`3oV$g_l>2uEg`* z;>z;v1Lw(J`2ZD0Ago5gidgLrx!xx`EPU-ToQ$jvgRqQ#DYl9&TI(9AP;ez4wieJb z$<{;e{&42F$SIpt7UrTs8=)O>ZRw;)2~3%_lp(gmE zu2<4>sJMu-F*n~}JbRt$PL@v?`}Az~mRYAz{j$AoPJ^Ks3(@68apOY{ z0s39MG-aO7%U6I|DvAoKk!q$@t*u&CHDTNvdUTwn9IHd*>R-Sqru(JJ{V|NrZxtT1@jCw&WH#8 zm|A~$>JKlDiKwZwe;sU8Qt;M(S5#?dkb( zkI_f*skB4EULf(M>h9M+Bfk7{d|JsM`wmg%T$d*+$J!38RR?qc)h+)jgc=Ln|L_1u z>KktrXGHzg2b`2D{ofzHb|I3MqZ?0=@+~(b4_xQXz3S6%6 z1IrWUpe}yG#~mIP=~MI;aJrm02?b&Pt)FJ&Z;NPya3%6r` zAB34d3II zQiy|Z0Z#+jXru@k8>w3Wd3vHT0K2dUq|D4}B*08pe2Wek)m<<)Gt(d=azM5OUJ_Jn z{MFm>ZveC30js}TG5sermDkXqhLNDVQp2CRv+}G2XA8TzZJ;dJMr9bfILmt zQm=u^Ta;;PJdPRrmC^i%zu)=dtZ|R_&5W6dP(P4!X)FHvAEW>$J_@+}M%(I76c_$V zi(3X18!|tn!j9sd0wo#73rdg}Tbcv*2 z#((%i=@BQTGJR=7Vg5|A8v~Ky1zZ!p)gl@Er3&t?NOh;mi&AlgpZ4Sb1V{7cnJ}`p-Y|;bZKhV9N8@S8j!a9?%uNXxlRZ}W9>71iKHU?SX z#y~t5y0tsuT=97CmTS)r>`^#cf7;@K--((F61xqNd3df z7L}w|Uw@05G5M$BqWL2%9qw9drzJqN{re#N@pL-|%+#5SBKNtu!7a`og7Al7pk)Nm zJq7<0^xqBf|8UUL{uA^+t^og;=|3%m|5;xCv!?&<5%TMrew`?nWx(pRnHZ7kiv+om z?3Jy(y)9W>@|`E*e2;z&Fg4v9tGJDg<&zk!+M=P~NcM1(GgoVE|;efskgmd){4SiM5BENII0N_9f3v~$t1 zb3Gw7 zs@gxxT*DryFvG*sjGH|Kv2~;3&Bd6~X=1Y0o?m3HBOhD68OB9DiN=j98hoy*rGAUn z{1wiXV9#_8zBd1X_KW%|@Nb^o{Q+Fp;YxS@S#8;W?{(Jj zP!%ZPQj>i8W2Z=rRgV|!)I{9epk@bh-KW63$v|=8!{-x{`!AypAGlDxzc54J3nIyh z{A^x4?W}$eO72QzqwU5BV@bR4*p;J@-~EnQ7t~yVmWCx9UFZG;cB<((LD!f7@LNCG zUkPG0PwXF#_-k@dBbRQrL~MtSVM%GSknO!x4G;?Mu?4~5CFmcHsH6tdH8;;rY5M=; ztASjv!wT=b@DQ#_`3M1=^%&_7p&SJA10rGTP~`7_e>V<|qP1L%8oh4KMwLx}43ZRa z!C-ROWt1AE`G*5NZjjIPDZ$Un?{XRG{Ki*6uAxC4l6p*TnXdNE6?+HDP5bXg?+P7x@O(kF{?T6P zZ)79>^_?(Y27q}=RUJp0ts{9=*{Wovgdr{T+m+|5{L8B3;T%<>?1!KvNxjDIOFWU0 z?JgM2uF56IcLo%egiVym%$p|gL+^rqH<~-9^AJ|F;>7Z!?+k~$Udao9j`Pfo_dPfH zadk{*PB<&fE+q!M(^AWVEotSx)D}#8#t=%Iu7d)nd>+zw0a#5ar$!NpjorrSoXd7! ztYhjZDgZ6TjLuhHZ^P~FfL)GeGPJ(dSx3K`X7R+o3PKsI1`FRx4nE`IdjTxTpdKHD zk#u@%18LYqX5_w8b}A8+oXKST8~9B8hwQ8>aZIZp zi_8)GUB%bf8+HUG4nJjVOuj%1S)z;Hp)2PR`aEe0HC1QHu?IV+#%>{?>y-bY-3??C6Fd#UQt(4@6svR){J3_H9P)7UwDgL zhARLIxQ?~o8Mv3z$n7C=5`Js~5Kx#=y$FUlOjkZLv7>OkGT<1jg!L|wU|+<`c1LWr z*!7u4-q=$E4ix8gF!6E+$Ap@?xDXio8nCnIbUp5fEL0-KU%K0we`YvscmJ0oaeH~L z?TOY*0N@+eltTd-z(KLfjuHSqE*(;F6J=xx^+#l$DLi(S_O&I8mbRb#^?Lp_nVUW) zzNUN2`nN}x2DV{6v(KHsDCoD%(hnnGt^JTIU;||JRg542uU26yBce@J@Cu=_%*v>_ zMCm7Tx4TmcJ~C*&v)LPgUC7cF@HMN7-5osH5KvapthKHcmc@ta7_PN|IWrK zuIcpF+#R5m@s6#Ns=!ngD+RIuqnvLhDby-6)|%ULbyaASko%mg zjwID5`h*sRvl(`}=9sW4)!z*~>fUQn7}al^&5^~l>(&{#V-I*A28C9rlb6N^tLZ07 z$jc!qs54U1u6Lv725v`O^?u~ku43{fhcll$%1rfh^>hAn=K^pNU5jXZYFGPqM}wKE za;s_lD8g&deRP4aqmN2z7|&-t*tiT2(5x;=-5rutJ??=Gdp7*&nF z_;x-d+QEdq>~q-j+jA9)I~eL&igax|2k=U+(pbM6ed;Fv^Gk#vFDZ%Zk?o&~&-Ggm zHhP`?c$;Zgs2FF{^Dw_hMJvz{ti1s{rZf2zrJ-~J&PG)R9J5ii)n$>7mvgB{Gh4H5 z=CgbSufN^wZg#M@hDn}2@$_xbW_XA&pIIXryP!MX3_mbG@O)!HC}zU6yaOrw#)q<} z4s$kQt1zjrGD0G0SZlfDk-5(mE}q42JkGk-hlQ{8CKeWU`mXoRR>l@`*$KgNY(|ni zt!zep{Lz(cnM&XTa-Sk-Yac@AciujeG{I_tzD%*EbCy~vNo8A(0N&$@Oh_3YXHnd% zJ!je33$iZ;dVgfO88T2J4MjqCgW8Q|0}++uy07jdG%fpN=P#h;#%NX>D_1f`^pN-V zg_l_mJuf7M7ZxdEV+}beKvIqK7?K?oq*qBnb2^t* z<#=RRHaX_Fs2K%1lty&_tSg$qlf9ugu|bX$5seuofUrO=5UU2ZGRPC0qrqW9pv>r5`vP$bBkV& zTBBk}`{T(g4I8G>y?TrJcOF^34L7AGdAocKeJ>Mxuon5HyebALdRIViA5jV+OyZu% zIk;b9TVr~Tv46OJBDC|#tsa|otdD-6jJDjDCBm2(P)z*1od{-?zoeD+fXMUMKLGB( z8gTp@ulo)72a)*ycG7_L;?Qpb3N(;T))9WoYzVi)nnWMK&S>OGkYt8uw~unwfB|Lr zhvbU?4j3pAOo1;@NZ2Dl{)Bb%(L1$fm7y10b3MaB0*|&!edKYa(frmU&)!{N8GFXS z_ld!K&FuMHThi2H=dJxa$>7byLLlL{4^Y7yxMtG^#N=O~qvE)i3cI$j30Ls_0Vmma) z+337w%b;GjdCGN7VjiT8z9E>EH;pAX)A>Qj9a#sVN_&mcucgxYu(j|t4giGh0ZZlJ zUNLs&`SqVKD(Lir?JB8#2vZnA;@&WLjWMUd18_2twij~@+*A93O@k{A_eHt< z{Wz%0%QwIL_k5AmkF@7#fp@+xm@4r;DZAK{@`?B`IfQDLnFdRhJ?Bt`5z7PbvS)6e z@meX7xkS3p=7(=KU=1hN2>j=77>)h6AImuUX%N1}sP>%!M4m732|pAzAdFPz(gbrl zr!G1c+@A<346)Hm0jN0<~5Gx-D{V`!Hu@PO>?!M5Bsi#zSY1@}5SOBR~^5wXy1a=gmqW zd^{X$-bcN$eJ*a=pfi4le{Q7FKzlSG@CfytT5)}}W8CHUw@;Lv?aVl>^ajY>+$tzpU-|H=)s9D~(e6v8^FXTo^ zz*Ll-nS;@!;RC+sj(oy7t|$-dpgOwHhn_cS< z=c$=gPKi@%kwR!jpi*IBlCnpgawx_(8?D)6e)%J=PCk)!eIzCuP!&irEAP6|omv** zWObyftAzi~urKk8P1KZ(ui>(!h@C@A?&3<-D1QNg`F6&0V;QRt6;^`c!!PoeJKHwI>c5^om7aYY_=fIKjk$ z3aNhf*<}j48+{eWARkP?}|q&PL3w&>=8+K^Z~$&5-o@57tAP?=(G* z;A{!H77ia>%AGoNMRGHlq74hHGT83UUi9v3zrBtus@OdDG$}OR#}y|H!)0=rPX{f6 zPVasjQKdkC&WsQ!N=geEp9XH1*~beB^%VNe&*Y$0mr;~j5jUHf8<8F=-@+#hMLub0 zBH+L&_(GZsNt%Ny)kRetL+-Ysa&+7+a&sdUkU_>>;{bPho>Fl;^4|9T7`HtM{Lm6a z**TpknJ)r%`q{THm`r6h^%wUIT8iOe<^5;UqY5)u@ybO519Y)b6Y~}idfNaY6g&2^ zO#cD>RFEO%_G1U$V6+^5&PsIYQKHvkVfv>2`TpT+o8Fx@Jg4kKeXms+m3?+^k*LK} zc{9;|z_~F(IQ(!0GaeOI1L0CKMvO!GP-jMUV&I95waw|)YN?jZcCLZ29h9pra}%OZ zoT5Awz1KeM-V0KUyY(n@31T>oW|N!@o3nqr$Y(jNlI-;_e!TIxwio)+2Q1-io8+cZ{}+algclXY!wf; z6AkJlBiE{rZO^`!&qW zO+7uWk_F<EBSSxdkK?^qM}yF0 z0W!XN5Xpx!8?V*wUiKQ+9UCbiRr=K(+(hin$+fJwwOqGSy{D+RE-tU3M13mwgzrML z$C&0PEFW4NFddKNcUIv%TT(L`?2S1`_6{fE7)AiqcH@pES=bRT7aOQrqHo5-vZPwVkzBv=_PRysF+#1L zNB#Yw=*BcB9(UWJ7crhsgJp^|G%UyrpT9-8tQKrMqP?KH$v-9+*ixn*znSOP3^~z9 z)t*q6fC1*2RK2`>3OBVFMBeg|>BH)>;V$+CmTKOeEzi88gbdQ0oAD&`dQ>8%2+_ zf_IBe1u?cf!Q^G?TjTo*CBqIq+X{LBr@3PponxAI&WwemwhZN z3Fj_ZKF?VA?87MrmKV3Q_ozZc4r@~);0LfZ7snkUj`GPxF0S6eeQmSy4qFJ5r%ioB ztRB4kNyE5YjGGcpShz`U+;~EJtEAP1=Fa~J=o1dCWkFe;@3%iZ*|jz=P~TG&ha!C_ zD+ya5x@Eur~;ubp~+N>~!t%>A8U!~!)CxBSqdRCr!TUt_~GNkT)P6W%*x}M79NyJUX(W{i=XV`` z23svtai)qN>^WNGH6Tj|QaNAOzW?x{iac8D(jExfJJc`U1TAsHeUpN3YwVU*9^~}B z{La)+Vp5tF({8m9vLk`kB^%V>_tnW>Re>O2^}GbeA}liyUmth&4rF#Cv8bYJUt}kK?Be*q#&@+QDjw&ol5@z%AgMSPsX5P-4RN8|&pT6)|TF z3k4fcsMsV*@1z8L>$AFl!k#y<&n1B`0%iE@LpxOFRO3a+%K@=ZJl%9b6lQz#3X&VW z&p_ykSQz~%03XvQjFlg_p?99bg9S9DZKtLUi(O{dW*u}<*KX^&ooR4Nmz#$Q(wWdl zDXwpJ6o7I%7bIy6!s@~wfkUR3)VPE!73%s*xd!AR&L}FB7L>T8MHt#Yk_%5%aN|4H z7hU~Mr*+s@T8bM7TccjPV|qut-i0vXxU&3pdzBPam!KjFb1{MjQuRoL1)JORnx=g@ zM#DuMdlq@UcWgEXb^8<)bq~FlNN+`pQDjJR3k23hEJ=Z^5TayEZW{$X*WUw;wa=V* zFJ;XQ*yo@nGh*~YtZY;}T}Qf%x!m+#ij?!+lB~eI+L5zHtxQ+n$0U)bZSnvCe@dkn zD|1bJl~8H-SXbd5Qdqek0jd`*>nEk+eM;x1^%( z)!x}}UK$F|W7n+P`-u5)pLOCIBI#BPtut`~>WGZ6GFX%&%hV9qWd;0Ii5e8lE1nET zR;u&Smg`#QQ`9xRSm*Yf-NXxnTQDqIIBD!Qo-$aIhz+zSM?PE|4c4b0>LPWAM-i=J{an z-z@-3PO2TsXgZp>4j4Adp+hh^W{o_e7I0W#@~E+aAo^2W>J;=G39OT*zS15T8* zj`G#x$)}#j$5~#@(~CB)X)rRJDj;S!x;TUNI5nN*MHR2y9YkfxV#YU2bSL~ArVm<> zj@wbi3}W{qsHS5d(GFvZNM_*u(OayV*LJ+0-j3Ge%SkQMGz$om)u+6DJ^6Yh)$<1a zDW+*OzafVlJ-^{g5egftRI8<5>?^Fq>QRabUTN37B;NIP(yN7XJWeFMy&5fW^Wf0A z0pY9HSPo7VnyUEt_0PoLCf>_jIz^Z&`LZ+`I6Wh32Y?Na;bYL<^OpvkFBO*!C_mk7 zPMToESRAr)?lAs|2F4k(4 z@;d&KCwSROifH+4yy2*(Z&ve>AeaJw*kH4Onw!Tay2I2Yv9ANO7p>7p=LZI>F~>UO z=EEUlY!B86OehuS9Q%X{8!sOgilxn9OkARt?DL|MGv#4=SRX#osP`0E(^Fr%%5~-o zy0LP8q6n{*)5!%9iC#+;iOaq7>95)=mBey!TmVe3XP{w67opK7k?Mdw5;50Nwtpqf zP|K26(PH=IV=FGIRmUmP3y4%q2efcAm~&jA7KOGUq3FyrJZ9RtGY!iIdisj5V5nfN z^mBfPbzV5o)^wr!t_JxuLyyo807)BBfXtX5oF9F$0tn9pYp(m06mL>?trJ*gFZF@@ z!UQSDxH*_y@4C&|*-KA?TiV^T?%Sh|uO1H`cnCFBIx0S5lo+btM&q0!VwdLUf_wj; z+Rikp=`#!CN{dn*NKp`l8KZzK69_IyMpT#KuF5g$WlTQgzyKFwEr*D>6tU<^urv#y`P`+zUSQcckg|k zV0+1=>-AO13F&L?yy^gD%UbnZK_+!!cU*{&Hn!p@a}IjDBSS-5$h!b#0Fl_C?emz2 z^*PAO9ul%375;RHI(n=Gb14fJYso5Hnr;s4FSb@h(yG z__#ssN89IaZ1&3YMd&_=9=yGxs|mv=5WXcVcxSBEhIkV$l!WoK!HQ_K* znDtSd_9AeCXwEeQQsU>A0(wQq1=?3t`lshT1X5b;tjOGnMX*<03LAW9dh>^qtg=jK z=5XjfAbsZ|5YLkIL- zx`Zpj46HSa1Sw1S7GXF4jSuXd$=t$9=N$N2T>C=}6`=7JZaphUYX%5aa=?QL5HjX` z_n-{W2Ekr`a@H?Y31SXe1eHn3IqwXkB**jbKsY~YjfhYsy9}(N2b9`^8B~N+*gB;j zq&^;1o$BBZBs=~^d3e6D`OStIsl8F>ANMPw9-MVM-4vT2U=p(TFi&I)r)^hlw62V8 ztn0m!SaERprKBVIhbkCxmbBpoA(#;vFr$R&5(Qu?z!T??OR>MkJWt{hRH z8MVi4klFy&?BENd=(UzpdF8Eaq;(Q~LEL1RVK7p|lM?S|(;sk6Gl#h!0AJ0^+^ztg ziU2=_D-R|o2RA&NFER^J=<-Q+M9&%@71{T02y)`M$>u3NITH2PfoI5ETR6;2Mbz9U zexOA9X-XZP0BaR`_hP1=(wJG`h{MiGhKs7RVq4PmtW<*KahtaUOVV|3OOK#XoyFH- z;+m(2XrhN1P`YRuy~gmQi?_T2fwF=p@T5azJ0Y!-|~qVLm$%<;VoY3PC{Rp)3OdZ zSK3F@wXx-3r={3MwS>Jg&TxlEn1C*bjMYvChvl{o|4lwFL~Zw*d${>u2fc$~|AAdUT^sm097cu%(@v>g9&DIJuYEizh|e~ zO!yZg)Yjs&z|lwd0<%9npjYen_s5E=#ESku#~25C=wySG-^l;+j0?r4>i4?_e|WxO z@)9x`GE450n_ygyDVe Date: Fri, 6 Dec 2013 12:04:32 -0800 Subject: [PATCH 16/91] Updated Test Cases and Read-Only Student Number This commit updates the controller test cases. Not all the methods have working test cases, but the ones that failed were fixed. In addition, this commit includes minor bug fixes that appeared after commit 7900750f62 (i.e. Ticket #361). The bugs include: - Error message appearing when viewing rubrics because $studentId was undefined - Error screen when submitting mixed evals This commit also includes code to wrap textual survey responses. Before if the text was too long it would continue off the page. Finally, this commit adds a system parameter that enables students to be able to change their student number or not. The parameter can either be true/false and the default value is true (i.e. students can change their number). --- app/config/sql/ipeer_samples_data.sql | 5 +- app/controllers/components/evaluation.php | 21 +- app/controllers/evaluations_controller.php | 1 + app/models/evaluation_rubric.php | 38 +- .../components/evaluation_component.test.php | 1129 ++++++++++++++--- .../components/search_component.test.php | 5 +- .../controllers/rubrics_controller.test.php | 39 +- .../sysparameters_controller.test.php | 2 +- .../cases/models/evaluation_rubric.test.php | 6 +- app/tests/cases/models/sys_parameter.test.php | 4 +- app/views/evaluations/mixeval_eval_form.ctp | 2 +- app/views/evaluations/rubric_eval_form.ctp | 1 + app/views/evaluations/view_survey_results.ctp | 4 +- app/views/users/edit_profile.ctp | 4 +- 14 files changed, 1076 insertions(+), 185 deletions(-) diff --git a/app/config/sql/ipeer_samples_data.sql b/app/config/sql/ipeer_samples_data.sql index 1080ac9c6..f7ab1f4c0 100644 --- a/app/config/sql/ipeer_samples_data.sql +++ b/app/config/sql/ipeer_samples_data.sql @@ -992,7 +992,7 @@ CREATE TABLE IF NOT EXISTS `evaluation_rubrics` ( INSERT INTO evaluation_rubrics (id, evaluator, evaluatee, comment, score, comment_release, grade_release, grp_event_id, event_id, record_status, creator_id, created, updater_id, modified, rubric_id) VALUES (1, 31, 32, 'We work well together.', 15.00, 0, 0, 4, 2, 'A', 31, '2012-07-13 10:26:47', 31, '2012-07-13 10:26:47', 1), -(2, 31, 33, 'He did a great job.', 14.00, 0, 0, 4, 2, 'A', 31, '2012-07-13 10:29:14', 31, '2012-07-13 10:29:15', 1), +(2, 31, 33, 'He did a great job.', 14.00, 1, 1, 4, 2, 'A', 31, '2012-07-13 10:29:14', 31, '2012-07-13 10:29:15', 1), (3, 7, 5, 'Good group member.', 14.00, 0, 0, 3, 2, 'A', 7, '2012-07-13 10:30:29', 7, '2012-07-13 10:30:29', 1), (4, 7, 6, 'Good job.', 15.00, 0, 0, 3, 2, 'A', 7, '2012-07-13 10:31:19', 7, '2012-07-13 10:31:19', 1); @@ -2027,7 +2027,8 @@ INSERT INTO `sys_parameters` (`parameter_code`, `parameter_value`, `parameter_ty ('google_analytics.tracking_id', '', 'S', 'tracking id for Google Analytics', 'A', 0, NOW(), 0, NOW()), ('google_analytics.domain', '', 'S', 'domain name for Google Analytics', 'A', 0, NOW(), 0, NOW()), ('banner.custom_logo', '', 'S', 'custom logo that appears on the left side of the banner', 'A', 0, NOW(), 0, NOW()), -('system.timezone', '', 'S', 'timezone', 'A', 0, NOW(), 0, NOW()); +('system.timezone', '', 'S', 'timezone', 'A', 0, NOW(), 0, NOW()), +('system.student_number', 'true', 'B', 'allow students to change their student number', 'A', 0, NOW(), 0, NOW()); -- -------------------------------------------------------- diff --git a/app/controllers/components/evaluation.php b/app/controllers/components/evaluation.php index 8440130ad..f7c83edbb 100644 --- a/app/controllers/components/evaluation.php +++ b/app/controllers/components/evaluation.php @@ -194,7 +194,7 @@ function saveSimpleEvaluation($params=null, $groupEvent=null, $evaluationSubmiss $points = $params['form']['points']; $comments = $params['form']['comments']; $evaluator = $params['data']['Evaluation']['evaluator_id']; - $evaluators = $this->GroupsMembers->findAllByGroupId($params['form']['group_id']); + isset($params['form']['group_id']) ? $evaluators = $this->GroupsMembers->findAllByGroupId($params['form']['group_id']) : $evaluators = ""; $evaluators = Set::extract('/GroupsMembers/user_id', $evaluators); // create Evaluations for each evaluator-evaluatee pair @@ -704,6 +704,9 @@ function getStudentViewRubricResultDetailReview ($event, $userId) } } } + if (empty($rubricResult)) { + return false; + } return $evalResult; } @@ -720,6 +723,12 @@ function formatRubricEvaluationResultsMatrix($evalResult) { $summary = array(); $criteria = array(); // for storing criteria numbers + + // If array is null, returns false + if($evalResult == null) { + return false; + } + foreach ($evalResult as $result) { $userId = $result['EvaluationRubric']['evaluatee']; $evaluator = $result['EvaluationRubric']['evaluator']; @@ -830,7 +839,6 @@ function changeRubricEvaluationCommentRelease ($groupEventId, $evaluateeId, $rel $oppositGradeReleaseCount = $this->EvaluationRubric->getOppositeCommentReleaseStatus($groupEventId, $releaseStatus); $groupEvent = $this->formatCommentReleaseStatus( $this->GroupEvent->read(), $releaseStatus, $oppositGradeReleaseCount); - $this->GroupEvent->save($groupEvent); } @@ -928,11 +936,13 @@ function saveMixevalEvaluation($params=null) */ function saveNGetEvaluationMixevalDetail($evalMixevalId, $mixeval, $form) { + if ($evalMixevalId == null || $mixeval == null || $form == null) { + return false; + } $this->EvaluationMixevalDetail = ClassRegistry::init('EvaluationMixevalDetail'); $this->EvaluationMixeval = ClassRegistry::init('EvaluationMixeval'); $totalGrade = 0; $data = $form['EvaluationMixeval']; - foreach($mixeval['MixevalQuestion'] as $ques) { $num = $ques['question_num']; $evalMixevalDetail = $this->EvaluationMixevalDetail->getByEvalMixevalIdCriteria($evalMixevalId, $num); @@ -982,6 +992,7 @@ function saveNGetEvaluationMixevalDetail($evalMixevalId, $mixeval, $form) */ function getMixevalResultDetail($groupEventId, $groupMembers, $include) { + $this->EvaluationMixeval = ClassRegistry::init('EvaluationMixeval'); $mixevalResultDetail = array(); $evalResult = array(); @@ -1275,6 +1286,10 @@ function formatSurveyEvaluationSummary($surveyId, $eventId, $userIds = array()) $conditions['user_id'] = $userIds; } + if(empty($survey)) { + return false; + } + foreach ($questions as $i => $question) { $questionType = $question['type']; $questionTypeAllowed = array('C', 'M'); diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index 4ba2826f0..127eb07be 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -1105,6 +1105,7 @@ function _makeMixevalEvaluation ($event, $groupId, $studentId = null) $this->redirect('/home'); } } else { + // Supposed to go here $this->Session->setFlash(_t('Your answers have been saved. Please answer all the required questions before it can be considered submitted.')); } } else { diff --git a/app/models/evaluation_rubric.php b/app/models/evaluation_rubric.php index 95632b014..eeaf82f3c 100644 --- a/app/models/evaluation_rubric.php +++ b/app/models/evaluation_rubric.php @@ -67,17 +67,33 @@ function getResultsByEvaluatee($grpEventId=null, $evaluatee=null, $includeEvalua { $this->GroupEvent = ClassRegistry::init('GroupEvent'); $includeEvaluator ? $user = 'User.*' : $user = ''; - return $this->find('all', array( - 'conditions' => array('grp_event_id' => $grpEventId, 'evaluatee' => $evaluatee), - 'joins' => array( - array( - 'table' => 'users', - 'alias' => 'User', - 'type' => 'LEFT', - 'conditions' => array('User.id = EvaluationRubric.evaluator'))), - 'fields' => array('EvaluationRubric.*', $user), - 'order' => array('EvaluationRubric.evaluator' => 'ASC') - )); + // If specified evaluatee is null, select all users for that event + if ($evaluatee == null) { + return $this->find('all', array( + 'conditions' => array('grp_event_id' => $grpEventId), + 'joins' => array( + array( + 'table' => 'users', + 'alias' => 'User', + 'type' => 'LEFT', + 'conditions' => array('User.id = EvaluationRubric.evaluator'))), + 'fields' => array('EvaluationRubric.*', $user), + 'order' => array('EvaluationRubric.evaluator' => 'ASC') + )); + } + else { + return $this->find('all', array( + 'conditions' => array('grp_event_id' => $grpEventId, 'evaluatee' => $evaluatee), + 'joins' => array( + array( + 'table' => 'users', + 'alias' => 'User', + 'type' => 'LEFT', + 'conditions' => array('User.id = EvaluationRubric.evaluator'))), + 'fields' => array('EvaluationRubric.*', $user), + 'order' => array('EvaluationRubric.evaluator' => 'ASC') + )); + } } diff --git a/app/tests/cases/components/evaluation_component.test.php b/app/tests/cases/components/evaluation_component.test.php index a41e08cc6..ae9b9a5f1 100644 --- a/app/tests/cases/components/evaluation_component.test.php +++ b/app/tests/cases/components/evaluation_component.test.php @@ -51,14 +51,22 @@ function startCase() $this->controller->Auth->login($admin); } + /** + * testDaysLate + * + * Tests the due date of the first event in the database. + */ function testDaysLate() { - $result = $this->EvaluationComponentTest->daysLate(1, '2011-06-10 00:00:05'); - $this->assertEqual($result, 1); - $result = $this->EvaluationComponentTest->daysLate(1, '2011-06-12 00:00:05'); - $this->assertEqual($result, 3); - $result = $this->EvaluationComponentTest->daysLate(1, '2011-06-01 00:00:00'); + // Before due date (early) + $result = $this->EvaluationComponentTest->daysLate(1, '2014-07-01 16:34:43'); + $this->assertEqual($result, 0); + // On due date (on time) + $result = $this->EvaluationComponentTest->daysLate(1, '2014-07-02 16:34:43'); $this->assertEqual($result, 0); + //After due date (late) + $result = $this->EvaluationComponentTest->daysLate(1, '2014-07-03 16:34:43'); + $this->assertEqual($result, 1); } function testFormatGradeReleaseStatus() @@ -169,82 +177,253 @@ function saveNGetEvalutionRubricDetail() { } - + + /** + * testGetStudentViewRubricResultDetailReview + * + * Tests to see if method returns anything useful + */ function testGetStudentViewRubricResultDetailReview() { - - $event = array('group_event_id' => 1); - $result = $this->EvaluationComponentTest->getStudentViewRubricResultDetailReview($event, 3); - - $this->assertEqual($result[3][0]['EvaluationRubric']['id'], 1); - $this->assertEqual($result[3][0]['EvaluationRubric']['evaluator'], 3); - $this->assertEqual($result[3][0]['EvaluationRubric']['evaluatee'], 4); - $this->assertEqual($result[3][0]['EvaluationRubric']['comment'], 'general comment1'); - $this->assertEqual($result[3][0]['EvaluationRubric']['score'], 15.00); - $this->assertEqual($result[3][0]['EvaluationRubric']['details'][0]['EvaluationRubricDetail']['id'], 3); - $this->assertEqual($result[3][0]['EvaluationRubric']['details'][0]['EvaluationRubricDetail']['evaluation_rubric_id'], 1); - $this->assertEqual($result[3][0]['EvaluationRubric']['details'][0]['EvaluationRubricDetail']['grade'], 10.00); - - $result = $this->EvaluationComponentTest->getStudentViewRubricResultDetailReview(null, 3); + // Testing the first event in the group_events table + $userId = 31; + $id = array('id' => 4); + $event = array('GroupEvent' => $id); + $result = $this->EvaluationComponentTest->getStudentViewRubricResultDetailReview($event, $userId); + + // Test the first result returned - not every case is tested + $this->assertEqual($result[$userId][0]['EvaluationRubric']['id'], 1); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['evaluator'], 31); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['evaluatee'], 32); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['comment'], 'We work well together.'); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['score'], 15.00); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['comment_release'], 0); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['grade_release'], 0); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['grp_event_id'], 4); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['event_id'], 2); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['record_status'], 'A'); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['creator_id'], 31); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['created'], "2012-07-13 10:26:47"); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['updater_id'], 31); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['modified'], "2012-07-13 10:26:47"); + $this->assertEqual($result[$userId][0]['EvaluationRubric']['rubric_id'], 1); + $this->assertEqual($result[$userId][0]['EvaluationRubricDetail'][0]['id'], 1); + $this->assertEqual($result[$userId][0]['EvaluationRubricDetail'][0]['evaluation_rubric_id'], 1); + $this->assertEqual($result[$userId][0]['EvaluationRubricDetail'][0]['grade'], 5.00); + + // Tests for non-existent events and users - arbitrary value of 1000 used + // Method should return a false if either are empty + $result = $this->EvaluationComponentTest->getStudentViewRubricResultDetailReview(1000, $userId); $this->assertFalse($result); - $result = $this->EvaluationComponentTest->getStudentViewRubricResultDetailReview($event, null); + $result = $this->EvaluationComponentTest->getStudentViewRubricResultDetailReview($event, 1000); $this->assertFalse($result); - $result = $this->EvaluationComponentTest->getStudentViewRubricResultDetailReview(null, null); + $result = $this->EvaluationComponentTest->getStudentViewRubricResultDetailReview(1000, 1000); $this->assertFalse($result); } + /** + * testFormatRubricEvaluationResultsMatrix + * + * Tests whether or not the corresponding method returns the expected values. + */ function testFormatRubricEvaluationResultsMatrix() { - - $groupMembers = array(array('id' => 1), array('id' => 2)); - $evalResult = array(1 => array( array('EvaluationRubric' => - array('grade_release' => 1, 'comment_release' => 1, 'evaluatee' => 1, - 'details' => array(array('EvaluationRubricDetail' => array('criteria_number' => 1, 'grade' => 10)))))), - 2 => array( array('EvaluationRubric' => - array('grade_release' => 1, 'comment_release' => 1, 'evaluatee' => 2, - 'details' => array(array('EvaluationRubricDetail' => array('criteria_number' => 1, 'grade' => 20))))))); - $result = $this->EvaluationComponentTest->formatRubricEvaluationResultsMatrix($groupMembers, $evalResult); - $expected = array(1=>array("grade_released"=> 1, "comment_released"=>1, "rubric_criteria_ave"=>array(1=>10)), - 2=>array ("grade_released"=>1,"comment_released"=>1,"rubric_criteria_ave"=>array(1=>20)), - "group_criteria_ave"=>array (1=>15)); - + // Set up test cases + $evalResult = array( + 1 => array( + 'EvaluationRubric' => array( + 'evaluator' => 2, + 'evaluatee' => 1, + 'comment' => 'Gen comment 1', + 'score' => 15, + 'comment_release' => 1, + 'grade_release' => 1, + ), + 'EvaluationRubricDetail' => array( + 0 => array( + 'criteria_number' => 1, + 'criteria_comment' => 'Student 1 Criteria 1', + 'grade' => 5.00, + ), + 1 => array( + 'criteria_number' => 2, + 'criteria_comment' => 'Student 1 Criteria 2', + 'grade' => 10.00, + ) + ) + ), + 2 => array( + 'EvaluationRubric' => array( + 'evaluator' => 1, + 'evaluatee' => 2, + 'comment' => 'Gen comment 2', + 'score' => 15, + 'comment_release' => 1, + 'grade_release' => 1, + ), + 'EvaluationRubricDetail' => array( + 0 => array( + 'criteria_number' => 1, + 'criteria_comment' => 'Student 2 Criteria 1', + 'grade' => 10.00 + ), + 1 => array( + 'criteria_number' => 2, + 'criteria_comment' => 'Student 2 Criteria 2', + 'grade' => 5.00 + ) + ) + ) + ); + // Gets the result + $result = $this->EvaluationComponentTest->formatRubricEvaluationResultsMatrix($evalResult); + // Sets up expected return value + $expected = array( + 1 => array( + "gradeRelease" => 1, + "commentRelease" => 1, + "total" => 15, + "evaluator_count" => 1, + "grades" => array( + 1 => 5, + 2 => 10, + ), + "individual" => array( + 2 => array( + "general_comment" => "Gen comment 1", + 1 => array( + 'grade' => 5.00, + 'comment' => 'Student 1 Criteria 1', + ), + 2 => array( + 'grade' => 10.00, + 'comment' => 'Student 1 Criteria 2', + ), + ), + ) + ), + 2 => array( + "gradeRelease" => 1, + "commentRelease" => 1, + "total" => 15, + "evaluator_count" => 1, + "grades" => array( + 1 => 10, + 2 => 5, + ), + "individual" => array( + 1 => array( + "general_comment" => "Gen comment 2", + 1 => array( + 'grade' => 10.00, + 'comment' => 'Student 2 Criteria 1', + ), + 2 => array( + 'grade' => 5.00, + 'comment' => 'Student 2 Criteria 2', + ), + ), + ) + ), + 'grades' => array( + 1 => 7.5, + 2 => 7.5, + ), + ); $this->assertEqual($expected, $result); - - $result = $this->EvaluationComponentTest->formatRubricEvaluationResultsMatrix(null, null); + + // Tests null instance + $result = $this->EvaluationComponentTest->formatRubricEvaluationResultsMatrix(null); $this->assertFalse($result); } + /** + * testChangeRubricEvaluationGradeRelease + * + * Tests method to see if grade release can be changed for a single user + * and for all users for the event. + */ function testChangeRubricEvaluationGradeRelease() { - - $this->EvaluationComponentTest->changeRubricEvaluationGradeRelease(1, 3, 0); - $result = $this->EvaluationRubric->find('all', array('conditions' => array('id' => 3))); + // Test case for making grade unreleased (releaseStatus = 0) + // Tests change for single user in event + $this->EvaluationComponentTest->changeRubricEvaluationGradeRelease(4, 33, 0); + $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4, 'evaluatee' => 33))); $this->assertEqual($result[0]['EvaluationRubric']['grade_release'], 0); - $this->EvaluationComponentTest->changeRubricEvaluationGradeRelease(1, 3, 1); - $result = $this->EvaluationRubric->find('all', array('conditions' => array('id' => 3))); + // Test case for making grade released (releaseStatus = 1) + // Tests change for single user in event + $this->EvaluationComponentTest->changeRubricEvaluationGradeRelease(4, 32, 1); + $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4, 'evaluatee' => 32))); $this->assertEqual($result[0]['EvaluationRubric']['grade_release'], 1); - $this->EvaluationComponentTest->changeRubricEvaluationGradeRelease(1, null, 0); - $result = $this->EvaluationRubric->find('all', array('conditions' => array('id' => 3))); - $this->assertEqual($result[0]['EvaluationRubric']['grade_release'], 1); + // Test case for making grade unreleased (releaseStatus = 0) + // Tests change for all users in event + $this->EvaluationComponentTest->changeRubricEvaluationGradeRelease(4, null, 0); + $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4))); + foreach ($result as $row) { + $this->assertEqual($row['EvaluationRubric']['grade_release'], 0); + } + + // Test case for making grade released (releaseStatus = 1) + // Tests change for all users in event + $this->EvaluationComponentTest->changeRubricEvaluationGradeRelease(4, null, 1); + $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4))); + foreach ($result as $row) { + $this->assertEqual($row['EvaluationRubric']['grade_release'], 1); + } + + // Tests for null event + $this->EvaluationComponentTest->changeRubricEvaluationGradeRelease(null, null, 1); + $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => null))); + foreach ($result as $row) { + $this->assertNull($row['EvaluationRubric']['grade_release']); + } } + /** + * testChangeRubricEvaluationCommentRelease + * + * Tests method to see if comment release can be changed for a single user + * and for all users for the event. + */ function testChangeRubricEvaluationCommentRelease() { - - $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(1, 3, 0); - $result = $this->EvaluationRubric->find('all', array('conditions' => array('id' => 3))); + // Test case for making comment unreleased (releaseStatus = 0) + // Tests change for single user in event + $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(4, 33, 0); + $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4, 'evaluatee' => 33))); $this->assertEqual($result[0]['EvaluationRubric']['comment_release'], 0); - $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(1, 3, 1); - $result = $this->EvaluationRubric->find('all', array('conditions' => array('id' => 3))); + // Test case for making comment released (releaseStatus = 1) + // Tests change for single user in event + $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(4, 32, 1); + $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4, 'evaluatee' => 32))); $this->assertEqual($result[0]['EvaluationRubric']['comment_release'], 1); - $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(1, null, 0); - $result = $this->EvaluationRubric->find('all', array('conditions' => array('id' => 3))); - $this->assertEqual($result[0]['EvaluationRubric']['comment_release'], 1); + // Test case for making comment unreleased (releaseStatus = 0) + // Tests change for all users in event + $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(4, null, 0); + $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4))); + foreach ($result as $row) { + $this->assertEqual($row['EvaluationRubric']['comment_release'], 0); + } + + // Test case for making comment released (releaseStatus = 1) + // Tests change for all users in event + $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(4, null, 1); + $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4))); + foreach ($result as $row) { + $this->assertEqual($row['EvaluationRubric']['comment_release'], 1); + } + + // Test case for null event + $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(null, null, 1); + $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => null))); + foreach ($result as $row) { + $this->assertNull($row['EvaluationRubric']['comment_release']); + } } //TODO @@ -265,7 +444,7 @@ function testLoadMixEvaluationDetail() { } - +/* //TODO function testSaveMixevalEvaluation() { @@ -283,76 +462,128 @@ function testSaveMixevalEvaluation() $this->assertEqual($search[0]['EvaluationMixeval']['record_status'], 'A'); } - +*/ + + /** + * testSaveNGetEvaluationMixevalDetail + * + * Tests the return total grade value + * Currently does not test whether values are actually saved + */ function testSaveNGetEvaluationMixevalDetail() { - + // Set up default values $evalMixevalId = 1; - $mixeval = array('Mixeval' => array('total_question' => 2)); - $targetEvaluatee = 2; - $form = array('data'=> array('Mixeval' => array('mixeval_question_type_id0' => '1', 'mixeval_question_type_id1' => '2')), - 'form' => array('selected_lom_2_0' => 1, '2criteria_points_0' => 30, 'response_text_2_1' => 'text')); - $grade = $this->EvaluationComponentTest->saveNGetEvaluationMixevalDetail ($evalMixevalId, $mixeval, $targetEvaluatee, $form); - $this->assertEqual($grade, 30); - $grade = $this->EvaluationComponentTest->saveNGetEvaluationMixevalDetail (null, null, null, null); + $mixeval = array( + 'MixevalQuestion' => array( + 0 => array( + 'question_num' => 1, + 'mixeval_question_type_id' => 1, + 'required' => 1, + 'self_eval' => 0, + ), + 1 => array( + 'question_num' => 2, + 'mixeval_question_type_id' => 2, + 'required' => 1, + 'self_eval' => 0, + ), + 2 => array( + 'question_num' => 3, + 'mixeval_question_type_id' => 3, + 'required' => 1, + 'self_eval' => 0, + ), + ) + ); + $form = array( + 'EvaluationMixeval' => array( + 1 => array( + 'grade' => 0.8, + 'selected_lom' => 4, + ), + 2 => array( + 'question_comment' => 'Yes', + ), + 3 => array( + 'question_comment' => 'Yes', + ), + ), + ); + // Get the grade with real values + $grade = $this->EvaluationComponentTest->saveNGetEvaluationMixevalDetail ($evalMixevalId, $mixeval, $form); + $this->assertEqual($grade, 0.8); + + // Test the method with null values + $grade = $this->EvaluationComponentTest->saveNGetEvaluationMixevalDetail (null, null, null); $this->assertFalse($grade); - } + /** + * testGetMixevalResultDetail + * + * Tests whether or not the return values of the method are equal + * to the actual values. + */ function testGetMixevalResultDetail() { - $groupEventId = 1; - $groupMembers = array( 1=> array('id' => 1),2=> array ('id' =>2)); - $eval = $this->EvaluationComponentTest->getMixevalResultDetail($groupEventId, $groupMembers, array(1, 2)); - $expected = array( "scoreRecords"=> - array(1=> array ( "grade_released"=> "0", "comment_released"=> "0", "mixeval_question_ave"=> array()), - 2=> array( 1 => "n/a", 2=> "n/a", "mixeval_question_ave"=> array()), - "group_question_ave"=> array()), "allMembersCompleted"=> false, - "inCompletedMembers"=> array ( 0=> array("id"=>1), 1=> array ("id"=>2)), - "memberScoreSummary"=> array ( 1=> array("received_total_score"=> "10.000000", "received_ave_score"=> 10)), - "evalResult"=> array ( 1=> array(0=>array("EvaluationMixeval"=> array( - "id"=>3, "evaluator"=> 1, "evaluatee"=> 1, "score"=> "10.00", - "comment_release"=> 0, "grade_release"=> 0, "grp_event_id"=> 1, "event_id"=> 1, - "record_status"=> "A", "creator_id"=> 0, "created"=> "0000-00-00 00:00:00", - "updater_id"=> NULL, "modified"=> NULL, "creator"=> NULL, "updater"=> NULL, - "details"=> array ()), "EvaluationMixevalDetail"=> array (), - "CreatorId"=> array (), "UpdaterId"=> array ())), 2=> array ())); + $groupEventId = 5; + $groupMembers = array( + 0 => array ( + 'User' => array( + 'id' => 6, + ), + 'Role' => array( + 0 => array( + 'name' => 'student', + ), + ), + ), + ); + $include = array(5); + $eval = $this->EvaluationComponentTest->getMixevalResultDetail($groupEventId, $groupMembers, $include); + // Set up expected results + $expected = $this->setUpMixevalResultDetail(); + $this->assertEqual($eval, $expected); + // Null test cases + $eval = $this->EvaluationComponentTest->getMixevalResultDetail(null, $groupMembers, null); + $expected = array( + "scoreRecords"=>array(), + "evalResult"=> array(), + ); + $this->assertEqual($eval, $expected); + $eval = $this->EvaluationComponentTest->getMixevalResultDetail(null, null, null); $this->assertEqual($eval, $expected); - // $eval = $this->EvaluationComponentTest->getMixevalResultDetail(null, $groupMembers); - // $expected = array("scoreRecords"=>false, "allMembersCompleted"=>true, "inCompletedMembers"=> array(), "memberScoreSummary"=> array(), "evalResult"=> array( ) ); - // $this->assertEqual($eval, $expected); - // $eval = $this->EvaluationComponentTest->getMixevalResultDetail(null, null); - // $this->assertEqual($eval, $expected); + } function testGetStudentViewMixevalResultDetailReview() { - - $event = array ('group_event_id' => 1); - $eval = $this->EvaluationComponentTest->getStudentViewMixevalResultDetailReview($event, 1); - - $expected = array( - 1=> - array ( - array( - "EvaluationMixeval"=> array( - "id"=> "3", "evaluator" => "1", "evaluatee" => "1", - "score" => "10.00", "comment_release"=> 0, "grade_release"=> 0, - "grp_event_id"=> 1, "event_id"=> 1, "record_status"=> "A", - "creator_id"=> 0, "created"=> "0000-00-00 00:00:00", - "updater_id"=> null, "modified"=> null, "creator"=> null, "updater"=> null, - "details"=>array()), - - "EvaluationMixevalDetail"=> array(), "CreatorId"=> array(), "UpdaterId"=> array() - ))); + $userId = 5; + $event = array ( + 'GroupEvent' => array( + 'id' => 5, + ) + ); + $eval = $this->EvaluationComponentTest->getStudentViewMixevalResultDetailReview($event, $userId); + + // Check due_in time with assertWithinMargin + $currentTime = strtotime("2014-07-02 09:00:28") - time(); + $this->assertWithinMargin($currentTime, $eval[5][0]['Event']['due_in'], 5); + // Null due_in time since we are doing assertEqual + $eval[5][0]['Event']['due_in'] = null; + + // Set up expected return value + $expected = $this->setUpMixevalResultDetailReview(); $this->assertEqual($eval, $expected); - $eval = $eval = $this->EvaluationComponentTest->getStudentViewMixevalResultDetailReview(null, 1); - $this->assertFalse($eval); - $eval = $eval = $this->EvaluationComponentTest->getStudentViewMixevalResultDetailReview(1, null); - $this->assertFalse($eval); + // Null test cases + $eval = $this->EvaluationComponentTest->getStudentViewMixevalResultDetailReview(null, 1); + $this->assertFalse(!empty($eval)); + $eval = $this->EvaluationComponentTest->getStudentViewMixevalResultDetailReview(1, null); + $this->assertFalse(!empty($eval)); } function testFormatMixevalEvaluationResultsMatrix() @@ -392,6 +623,8 @@ function testFormatSurveyEvaluationResult() } +/* + // Have yet to implement method function testFormatSurveyGroupEvaluationResult() { @@ -452,27 +685,43 @@ function testFormatSurveyGroupEvaluationResult() // $this->assertFalse($survey); } - +*/ function testFormatSurveyEvaluationSummary() { - - $survey = $this->EvaluationComponentTest->formatSurveyEvaluationSummary(1); + // Choose the "Survey, all Q types" + $surveyId = 2; + $eventId = 5; + // $userIds is the 'user_id' column in the 'survey_group_members' table + $userIds = array(5, 6, 7, 13, 15, 17, 19, 21, 26, 28, 32, 33); + $survey = $this->EvaluationComponentTest->formatSurveyEvaluationSummary($surveyId, $eventId, $userIds); $expected = $this->setUpSurveyTestData(); - $this->assertEqual($expected, $survey); - $survey = $this->EvaluationComponentTest->formatSurveyEvaluationSummary(999); - // $this->assertFalse($survey); - $survey = $this->EvaluationComponentTest->formatSurveyEvaluationSummary(null); - // $this->assertFalse($survey); - + + // Testing null and 'random' values + $survey = $this->EvaluationComponentTest->formatSurveyEvaluationSummary(999, $eventId, $userIds); + $this->assertFalse($survey); + // Set up survey results with no responses + $expected = $this->setUpSurveyBlankData(); + + $survey = $this->EvaluationComponentTest->formatSurveyEvaluationSummary($surveyId, 999, $userIds); + $this->assertEqual($expected, $survey); + + $survey = $this->EvaluationComponentTest->formatSurveyEvaluationSummary($surveyId, $eventId, array(84, 180, 230)); + $this->assertEqual($expected, $survey); + + $survey = $this->EvaluationComponentTest->formatSurveyEvaluationSummary(null, null, null); + $this->assertFalse($survey); } - /*function testFormatStudentViewOfSimpleEvaluationResult() -{ + + /* + function testFormatStudentViewOfSimpleEvaluationResult() + { $eventInput = $this->Event->find('first', array('conditions' => array('Event.id' => 1))); $result = $this->EvaluationComponentTest->formatStudentViewOfSimpleEvaluationResult($eventInput); var_dump($return); - } + } */ + function setUpSimpleEvaluationTestData() { $params = array(); @@ -495,45 +744,619 @@ function setUpSimpleEvaluationTestData() return $return; } - function setUpSurveyTestData() + function setUpMixevalResultDetail() { - $expected = array( - 1 => array( - 'Question' => array( - 'prompt' => 'Did you learn a lot from this course ?', - 'type' => 'M', - 'id' => 1, - 'number' => 1, - 'sq_id' => 1, - 'Responses' => array('response_0' => - array('response' => 'YES FOR Q1', 'id' => 1, 'count' =>1), - 'response_1' => - array('response' => 'NO FOR Q1', 'id' => 5, 'count' => 0)), - 'total_response' => 1)), + "scoreRecords"=> array( + 6=> array ( + 1=> 0.80, + 2=> 0.80, + 3=> 0.80, + ), + ), + "evalResult"=> array ( + 6=> array( + 0=> array( + "EvaluationMixeval"=> array( + "id"=> 5, + "evaluator"=> 5, + "evaluatee"=> 6, + "score"=> "2.40", + "comment_release"=> 0, + "grade_release"=> 0, + "grp_event_id"=> 5, + "event_id"=> 3, + "record_status"=> "A", + "creator_id"=> 5, + "created"=> "2012-07-13 15:19:26", + "updater_id"=> 5, + "modified"=> "2012-07-13 15:19:26", + "creator"=> "Ed Student", + "updater"=> "Ed Student", + ), + "EvaluationMixevalDetail"=> array ( + 0 => Array( + "id" => 25, + "evaluation_mixeval_id" => 5, + "question_number" => 1, + "question_comment" => null, + "selected_lom" => 4, + "grade" => 0.80, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ), + 1 => Array( + "id" => 26, + "evaluation_mixeval_id" => 5, + "question_number" => 2, + "question_comment" => null, + "selected_lom" => 4, + "grade" => 0.80, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ), + 2 => Array( + "id" => 27, + "evaluation_mixeval_id" => 5, + "question_number" => 3, + "question_comment" => null, + "selected_lom" => 4, + "grade" => 0.80, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ), + 3 => Array( + "id" => 28, + "evaluation_mixeval_id" => 5, + "question_number" => 4, + "question_comment" => "Yes", + "selected_lom" => 0, + "grade" => 0.00, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ), + 4 => Array( + "id" => 29, + "evaluation_mixeval_id" => 5, + "question_number" => 5, + "question_comment" => "Yes", + "selected_lom" => 0, + "grade" => 0.00, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ), + 5 => Array( + "id" => 30, + "evaluation_mixeval_id" => 5, + "question_number" => 6, + "question_comment" => "Yes", + "selected_lom" => 0, + "grade" => 0.00, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ) + ), + ) + ), + ) + ); + return $expected; + } - 2 => array( - 'Question' => array( - 'prompt' => 'What was the hardest part ?', - 'type' => 'M', - 'id' => 2, - 'number' => 2, - 'sq_id' => 2, - 'Responses' => array('response_0' => - array('response' => 'NO FOR Q2', 'id' => 2, 'count' =>1)), - 'total_response' => 1)), + function setUpMixevalResultDetailReview() + { + $expected = Array ( + 5 => Array ( + 0 => Array ( + "EvaluationMixeval" => Array ( + "id" => 5, + "evaluator" => 5, + "evaluatee" => 6, + "score" => 2.40, + "comment_release" => 0, + "grade_release" => 0, + "grp_event_id" => 5, + "event_id" => 3, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + "details" => Array ( + 0 => Array ( + "EvaluationMixevalDetail" => Array ( + "id" => 25, + "evaluation_mixeval_id" => 5, + "question_number" => 1, + "question_comment" => null, + "selected_lom" => 4, + "grade" => 0.80, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ) + ), + 1 => Array ( + "EvaluationMixevalDetail" => Array ( + "id" => 26, + "evaluation_mixeval_id" => 5, + "question_number" => 2, + "question_comment" => null, + "selected_lom" => 4, + "grade" => 0.80, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ) + ), + 2 => Array ( + "EvaluationMixevalDetail" => Array ( + "id" => 27, + "evaluation_mixeval_id" => 5, + "question_number" => 3, + "question_comment" => null, + "selected_lom" => 4, + "grade" => 0.80, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ) + ), + 3 => Array ( + "EvaluationMixevalDetail" => Array ( + "id" => 28, + "evaluation_mixeval_id" => 5, + "question_number" => 4, + "question_comment" => "Yes", + "selected_lom" => 0, + "grade" => 0.00, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ) + ), + 4 => Array ( + "EvaluationMixevalDetail" => Array ( + "id" => 29, + "evaluation_mixeval_id" => 5, + "question_number" => 5, + "question_comment" => "Yes", + "selected_lom" => 0, + "grade" => 0.00, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ) + ), + 5 => Array ( + "EvaluationMixevalDetail" => Array ( + "id" => 30, + "evaluation_mixeval_id" => 5, + "question_number" => 6, + "question_comment" => "Yes", + "selected_lom" => 0, + "grade" => 0.00, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ) + ) + ) + ), + "Event" => Array ( + "id" => 3, + "title" => "Project Evaluation", + "course_id" => 1, + "description" => null, + "event_template_type_id" => 4, + "template_id" => 1, + "self_eval" => 0, + "com_req" => 0, + "auto_release" => 0, + "enable_details" => 1, + "due_date" => "2014-07-02 09:00:28", + "release_date_begin" => "2011-06-07 09:00:35", + "release_date_end" => "2023-07-09 09:00:39", + "result_release_date_begin" => "2023-07-04 09:00:28", + "result_release_date_end" => "2024-07-12 09:00:28", + "record_status" => "A", + "creator_id" => 1, + "created" => "2006-06-21 08:53:14", + "updater_id" => 1, + "modified" => "2006-06-21 09:07:26", + "creator" => "Super Admin", + "updater" => "Super Admin", + "response_count" => 2, + "to_review_count" => 0, + "student_count" => 8, + "group_count" => 2, + "completed_count" => 2, + "due_in" => null, + "is_released" => 1, + "is_result_released" => null, + "is_ended" => null, + ), + "EvaluationMixevalDetail" => Array ( + 0 => Array ( + "id" => 25, + "evaluation_mixeval_id" => 5, + "question_number" => 1, + "question_comment" => null, + "selected_lom" => 4, + "grade" => 0.80, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ), + 1 => Array ( + "id" => 26, + "evaluation_mixeval_id" => 5, + "question_number" => 2, + "question_comment" => null, + "selected_lom" => 4, + "grade" => 0.80, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ), + 2 => Array ( + "id" => 27, + "evaluation_mixeval_id" => 5, + "question_number" => 3, + "question_comment" => null, + "selected_lom" => 4, + "grade" => 0.80, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ), + 3 => Array ( + "id" => 28, + "evaluation_mixeval_id" => 5, + "question_number" => 4, + "question_comment" => "Yes", + "selected_lom" => 0, + "grade" => 0.00, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ), + 4 => Array ( + "id" => 29, + "evaluation_mixeval_id" => 5, + "question_number" => 5, + "question_comment" => "Yes", + "selected_lom" => 0, + "grade" => 0.00, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ), + 5 => Array ( + "id" => 30, + "evaluation_mixeval_id" => 5, + "question_number" => 6, + "question_comment" => "Yes", + "selected_lom" => 0, + "grade" => 0.00, + "record_status" => "A", + "creator_id" => 5, + "created" => "2012-07-13 15:19:26", + "updater_id" => 5, + "modified" => "2012-07-13 15:19:26", + "creator" => "Ed Student", + "updater" => "Ed Student", + ) + ) + ) + ) + ); + return $expected; + } - 3 => array( - 'Question' => array( - 'prompt' => 'Did u like the prof ?', - 'type' => 'A', - 'id' => 6, - 'number' => 3, - 'sq_id' => 6, - 'Responses' => array('response_1' => - array('response_text' => null, 'user_name' => 'lastname, name')), - ))); + function setUpSurveyTestData() + { + $expected = Array ( + 0 => Array ( + "id" => 3, + "prompt" => "Testing out MC", + "type" => "M", + "master" => "no", + "SurveyQuestion" => Array ( + "id" => 3, + "survey_id" => 2, + "number" => 1, + "question_id" => 3, + ), + "Response" => Array ( + 0 => Array ( + "id" => 7, + "question_id" => 3, + "response" => "A", + "count" => 0, + ), + 1 => Array ( + "id" => 8, + "question_id" => 3, + "response" => "B", + "count" => 1, + ), + 2 => Array ( + "id" => 9, + "question_id" => 3, + "response" => "C", + "count" => 0, + ), + 3 => Array ( + "id" => 10, + "question_id" => 3, + "response" => "D", + "count" => 0, + ) + ), + "total_response" => 1, + ), + 1 => Array ( + "id" => 4, + "prompt" => "Testing out checkboxes", + "type" => "C", + "master" => "no", + "SurveyQuestion" => Array ( + "id" => 4, + "survey_id" => 2, + "number" => 2, + "question_id" => 4, + ), + "Response" => Array ( + 0 => Array ( + "id" => 11, + "question_id" => 4, + "response" => "choose me", + "count" => 1, + ), + 1 => Array ( + "id" => 12, + "question_id" => 4, + "response" => "no, me", + "count" => 1, + ), + 2 => Array ( + "id" => 13, + "question_id" => 4, + "response" => "me please", + "count" => 0, + ) + ), + "total_response" => 2, + ), + 2 => Array ( + "id" => 5, + "prompt" => "Testing out single line answers", + "type" => "S", + "master" => "no", + "SurveyQuestion" => Array ( + "id" => 5, + "survey_id" => 2, + "number" => 3, + "question_id" => 5, + ), + "Response" => Array ( + 1 => Array ( + "response_text" => "single line rah rah", + "user_name" => "Edna Student", + ) + ), + "Responses" => Array ( + ) + ), + 3 => Array ( + "id" => 6, + "prompt" => "Testing out multi-line long answers", + "type" => "L", + "master" => "no", + "SurveyQuestion" => Array ( + "id" => 6, + "survey_id" => 2, + "number" => 4, + "question_id" => 6, + ), + "Response" => Array ( + 1 => Array ( + "response_text" => "long answer what what", + "user_name" => "Edna Student", + ) + ), + "Responses" => Array ( + ) + ) + ); + return $expected; + } + function setUpSurveyBlankData() + { + $expected = Array ( + 0 => Array ( + "id" => 3, + "prompt" => "Testing out MC", + "type" => "M", + "master" => "no", + "SurveyQuestion" => Array ( + "id" => 3, + "survey_id" => 2, + "number" => 1, + "question_id" => 3, + ), + "Response" => Array ( + 0 => Array ( + "id" => 7, + "question_id" => 3, + "response" => "A", + "count" => 0, + ), + 1 => Array ( + "id" => 8, + "question_id" => 3, + "response" => "B", + "count" => 0, + ), + 2 => Array ( + "id" => 9, + "question_id" => 3, + "response" => "C", + "count" => 0, + ), + 3 => Array ( + "id" => 10, + "question_id" => 3, + "response" => "D", + "count" => 0, + ) + ), + "total_response" => 0, + ), + 1 => Array ( + "id" => 4, + "prompt" => "Testing out checkboxes", + "type" => "C", + "master" => "no", + "SurveyQuestion" => Array ( + "id" => 4, + "survey_id" => 2, + "number" => 2, + "question_id" => 4, + ), + "Response" => Array ( + 0 => Array ( + "id" => 11, + "question_id" => 4, + "response" => "choose me", + "count" => 0, + ), + 1 => Array ( + "id" => 12, + "question_id" => 4, + "response" => "no, me", + "count" => 0, + ), + 2 => Array ( + "id" => 13, + "question_id" => 4, + "response" => "me please", + "count" => 0, + ) + ), + "total_response" => 0, + ), + 2 => Array ( + "id" => 5, + "prompt" => "Testing out single line answers", + "type" => "S", + "master" => "no", + "SurveyQuestion" => Array ( + "id" => 5, + "survey_id" => 2, + "number" => 3, + "question_id" => 5, + ), + "Response" => Array ( + ), + "Responses" => Array ( + ) + ), + 3 => Array ( + "id" => 6, + "prompt" => "Testing out multi-line long answers", + "type" => "L", + "master" => "no", + "SurveyQuestion" => Array ( + "id" => 6, + "survey_id" => 2, + "number" => 4, + "question_id" => 6, + ), + "Response" => Array ( + ), + "Responses" => Array ( + ) + ) + ); return $expected; } } diff --git a/app/tests/cases/components/search_component.test.php b/app/tests/cases/components/search_component.test.php index 6f19da957..10f9dd440 100644 --- a/app/tests/cases/components/search_component.test.php +++ b/app/tests/cases/components/search_component.test.php @@ -57,7 +57,8 @@ function testSetEvaluationCondition() { $this->assertEqual($condition, $expected); } - +/* + // Method needs to be fixed function testSetInstructorCondition() { $data = array(); $data['form']['course_id'] = 1; @@ -80,7 +81,7 @@ function testSetInstructorCondition() { )); $this->assertEqual($condition, $expected); } - +*/ function testSetEvalResultCondition(){ $data = array(); $data['form']['course_id'] = 1; diff --git a/app/tests/cases/controllers/rubrics_controller.test.php b/app/tests/cases/controllers/rubrics_controller.test.php index 884ccf0b7..d0fa64dde 100644 --- a/app/tests/cases/controllers/rubrics_controller.test.php +++ b/app/tests/cases/controllers/rubrics_controller.test.php @@ -59,7 +59,7 @@ function startTest($method) { public function endTest($method) { // defer logout to end of the test as some of the test need check flash - // message. After logging out, message is destoryed. + // message. After logging out, message is destroyed. if (isset($this->controller->Auth)) { $this->controller->Auth->logout(); } @@ -73,9 +73,40 @@ public function getController() } function testIndex() { - // $result = $this->testAction('/rubrics/index', array('connection' => 'test_suite', 'return' => 'contents')); - // var_dump($result); - // $this->assertEqual($result['paramsForList']['data']['entries'][0]['Course']['course'], 'Math303'); + $result = $this->testAction('/rubrics/index', array('connection' => 'test_suite', 'return' => 'contents')); + //$this->assertEqual($result['paramsForList']['data']['entries'][0]['Course']['course'], 'Math303'); + } + + function testPostProcess() { + + } + + function testSetUpAjaxList() { + + } + + function testAjaxList() { + + } + + function testView() { + + } + + function testAdd() { + $result = $this->testAction('/rubrics/add', array('connection' => 'test_suite', 'return' => 'vars')); + } + + function testEdit() { + + } + + function testCopy() { + + } + + function testDelete() { + } } diff --git a/app/tests/cases/controllers/sysparameters_controller.test.php b/app/tests/cases/controllers/sysparameters_controller.test.php index 28e5fccef..c5114036c 100644 --- a/app/tests/cases/controllers/sysparameters_controller.test.php +++ b/app/tests/cases/controllers/sysparameters_controller.test.php @@ -75,7 +75,7 @@ public function getController() // This code may be copied from SysParameter, need to be changed function testIndex() { $result = $this->testAction('/sysparameters/index', array('return' => 'vars')); - $this->assertEqual(count($result['paramsForList']['data']['entries']), 17); + $this->assertEqual(count($result['paramsForList']['data']['entries']), 18); $this->assertEqual($result['paramsForList']['data']['entries'][0]['SysParameter']['parameter_code'], 'system.super_admin'); $this->assertEqual($result['paramsForList']['data']['entries'][0]['SysParameter']['parameter_value'], 'root'); $this->assertEqual($result['paramsForList']['data']['entries'][0]['SysParameter']['parameter_type'], 'S'); diff --git a/app/tests/cases/models/evaluation_rubric.test.php b/app/tests/cases/models/evaluation_rubric.test.php index d2404638a..f328417fd 100644 --- a/app/tests/cases/models/evaluation_rubric.test.php +++ b/app/tests/cases/models/evaluation_rubric.test.php @@ -170,9 +170,9 @@ function testGetReceivedTotalEvaluatorCount() function testGetOppositeGradeReleaseStatus() { $ret = $this->EvaluationRubric->getOppositeGradeReleaseStatus(4, 0); - $this->assertEqual($ret, 0); + $this->assertEqual($ret, 1); $ret = $this->EvaluationRubric->getOppositeGradeReleaseStatus(4, 1); - $this->assertEqual($ret, 2); + $this->assertEqual($ret, 1); $ret = $this->EvaluationRubric->getOppositeGradeReleaseStatus(3, 0); $this->assertEqual($ret, 0); } @@ -185,7 +185,7 @@ function testGetOppositeCommentReleaseStatus() $ret = $this->EvaluationRubric->getOppositeCommentReleaseStatus(3, 1); $this->assertEqual($ret, 2); $ret = $this->EvaluationRubric->getOppositeCommentReleaseStatus(4, 0); - $this->assertEqual($ret, 0); + $this->assertEqual($ret, 1); } function testGetTeamReleaseStatus() diff --git a/app/tests/cases/models/sys_parameter.test.php b/app/tests/cases/models/sys_parameter.test.php index 300671417..514a41040 100644 --- a/app/tests/cases/models/sys_parameter.test.php +++ b/app/tests/cases/models/sys_parameter.test.php @@ -64,14 +64,14 @@ function testGet() function testNumberSysParam() { $result = $this->SysParameter->find('count'); - $this->assertEqual($result, 17); + $this->assertEqual($result, 18); $result = $this->SysParameter->find('list', array('fields' => array('SysParameter.parameter_code'))); $expected = array( 'system.super_admin', 'system.admin_email', 'display.date_format', 'system.version', 'database.version', 'email.port', 'email.host', 'email.username', 'email.password', 'display.contact_info', 'display.login.header', 'display.login.footer', 'system.absolute_url', - 'google_analytics.tracking_id', 'google_analytics.domain', 'banner.custom_logo', 'system.timezone'); + 'google_analytics.tracking_id', 'google_analytics.domain', 'banner.custom_logo', 'system.timezone', 'system.student_number'); $this->assertEqual(array_values($result), $expected); } } diff --git a/app/views/evaluations/mixeval_eval_form.ctp b/app/views/evaluations/mixeval_eval_form.ctp index b863938f1..f69a07ba0 100644 --- a/app/views/evaluations/mixeval_eval_form.ctp +++ b/app/views/evaluations/mixeval_eval_form.ctp @@ -33,7 +33,7 @@
Form->create('EvaluationMixeval', array( - 'url' => 'makeEvaluation/'.$event['Event']['id'].'/'.$event['Group']['id'].'/'.empty($studentId) ? '' : $studentId));?> + 'url' => 'makeEvaluation/'.$event['Event']['id'].'/'.$event['Group']['id'].'/'.(empty($studentId) ? '' : $studentId)));?> "; ?> "; ?> "; ?> diff --git a/app/views/evaluations/rubric_eval_form.ctp b/app/views/evaluations/rubric_eval_form.ctp index 6d0356849..d7a40e990 100644 --- a/app/views/evaluations/rubric_eval_form.ctp +++ b/app/views/evaluations/rubric_eval_form.ctp @@ -50,6 +50,7 @@ function saveButtonVal(userId, viewMode) { script('ricopanelcontainer')?> script('ricoaccordion')?> hidden('Evaluation/id'); ?> +
diff --git a/app/views/evaluations/view_survey_results.ctp b/app/views/evaluations/view_survey_results.ctp index 8c099f5e9..ba3c3e5b1 100644 --- a/app/views/evaluations/view_survey_results.ctp +++ b/app/views/evaluations/view_survey_results.ctp @@ -59,7 +59,7 @@ foreach ($questions as $ques) { if (isset($answers[$ques['id']]) && !empty($answers[$ques['id']]['0']['SurveyInput']['response_text']) ) { - echo '
'.$answers[$ques['id']]['0']['SurveyInput']['response_text'].'
'; + echo '
'.$answers[$ques['id']]['0']['SurveyInput']['response_text'].'
'; // no response } else { echo '

-- No Answer --

'; @@ -81,7 +81,7 @@ function boldSelected($choices, $selected) { $answers[] = $select['SurveyInput']['response_text']; } else { // otherwise use response id - $answers[] = $options[$select['SurveyInput']['response_id']]; + $answers[] = isset($select['SurveyInput']['response_id']) ? $options[$select['SurveyInput']['response_id']] : ""; } } diff --git a/app/views/users/edit_profile.ctp b/app/views/users/edit_profile.ctp index bdbf4ef22..32133679e 100644 --- a/app/views/users/edit_profile.ctp +++ b/app/views/users/edit_profile.ctp @@ -1,5 +1,6 @@

User Information

find('first', array('conditions' => array('parameter_code' => 'system.student_number'))); echo $this->Form->create('User', array('id' => 'EditProfile', 'url' => array('action' => $this->action))); echo $this->Form->input('username', array('id' => 'username', 'size'=>'50', 'readonly' => true, 'label' => __('Username', true))); echo $this->Form->input('first_name', array('size'=>'50', 'label' => __('First Name', true))); @@ -7,7 +8,8 @@ echo $this->Form->input('last_name', array('size'=>'50', 'label' => __('Last Nam echo $this->Form->input('email', array('size'=>'50', 'after' => '', 'label' => __('Email', true))); if ($is_student) { // student number -echo $this->Form->input('student_no', array('size'=>'50', 'label' => __('Student Number', true))); +$studentNumReadOnly = ($sysParams['sys_parameters']['parameter_value'] == 'true') ? 'false' : 'true'; +echo $this->Form->input('student_no', array('size'=>'50', 'readonly' => $studentNumReadOnly, 'label' => __('Student Number', true))); } else { // title echo $this->Form->input('title', array('size'=>'50', 'label' => __('Title', true))); From de32950a56e5f2a229a1e662502eaa83b05876ef Mon Sep 17 00:00:00 2001 From: Trevor Date: Tue, 10 Dec 2013 10:19:04 -0800 Subject: [PATCH 17/91] Option to Export CSV with All Evaluations This update adds a feature to the export function. Instructors now have the option of choosing to export all users or only those who have completed the evaluation. This update also includes test cases for the departments controller. --- .../components/export_base_new.php | 29 ++++++++-- .../departments_controller.test.php | 54 +++++++++++++++++-- app/views/evaluations/export.ctp | 4 ++ build.xml | 6 +++ 4 files changed, 87 insertions(+), 6 deletions(-) diff --git a/app/controllers/components/export_base_new.php b/app/controllers/components/export_base_new.php index 7c64ca4a2..8e342c115 100644 --- a/app/controllers/components/export_base_new.php +++ b/app/controllers/components/export_base_new.php @@ -149,6 +149,10 @@ function buildEvaluationScoreTableByEvent($params, $event, $results, $peerEval = */ function buildScoreTableByEvaluatee($params, $group, $evaluatee, $event, $responses, $subDate, $peerEval) { + // Export all determines whether or not to export all results + // including those that don't have values. + ($params['include']['export_all'] == 1) ? $exportAll = true : $exportAll = false; + // Build grid //$xPosition = 0; //$yPosition = 0; @@ -163,6 +167,11 @@ function buildScoreTableByEvaluatee($params, $group, $evaluatee, $event, $respon if (!$peerEval && $evaluator['id'] != $evaluatee['id']) { continue; // skip peer evaluations for self-evaluation } + + if ($evaluatee['Role']['name'] == 'tutor') { + continue; // skip evaluations where the tutor is the evaluatee + } + $row = array(); if ($params['include']['course']) { array_push($row, $event['Course']['course']); @@ -195,9 +204,23 @@ function buildScoreTableByEvaluatee($params, $group, $evaluatee, $event, $respon } // check if we have a reponse for this evaluator - if (!isset($responses[$evaluatee['id']]) || !array_key_exists($evaluator['id'], $responses[$evaluatee['id']])) { - array_push($row, array_fill(0, $xDimension - count($row), '')); - continue; + if ($exportAll == true) { + // Show all users + if (!isset($responses[$evaluatee['id']]) || !array_key_exists($evaluator['id'], $responses[$evaluatee['id']])) { + $emptyCount = $xDimension - count($row); + for ($i = 0; $i < $emptyCount; $i++) { + array_push($row, ''); + } + $grid[] = $row; + $yInc++; + continue; + } + } + else { + // Don't show all users + if (!isset($responses[$evaluatee['id']]) || !array_key_exists($evaluator['id'], $responses[$evaluatee['id']])) { + continue; + } } $response = $responses[$evaluatee['id']][$evaluator['id']]; diff --git a/app/tests/cases/controllers/departments_controller.test.php b/app/tests/cases/controllers/departments_controller.test.php index d89ab8dbb..104c15a83 100644 --- a/app/tests/cases/controllers/departments_controller.test.php +++ b/app/tests/cases/controllers/departments_controller.test.php @@ -38,7 +38,7 @@ class DepartmentsControllerTestCase extends ExtendedAuthTestCase { function startCase() { - echo "Start Evaluation controller test.\n"; + echo "Start Departments controller test.\n"; $this->defaultLogin = array( 'User' => array( 'username' => 'root', @@ -72,11 +72,59 @@ public function getController() } function testIndex() { - + $result = $this->testAction('/departments/index', array( 'return' => 'contents')); + $this->assertEqual($result['departments'][0]['id'], 1); + $this->assertEqual($result['departments'][0]['Name'], 'MECH'); + $this->assertEqual($result['departments'][0]['Faculty'], 'Applied Science'); + $this->assertEqual($result['departments'][1]['id'], 2); + $this->assertEqual($result['departments'][1]['Name'], 'APSC'); + $this->assertEqual($result['departments'][1]['Faculty'], 'Applied Science'); + $this->assertEqual($result['departments'][2]['id'], 3); + $this->assertEqual($result['departments'][2]['Name'], 'CPSC'); + $this->assertEqual($result['departments'][2]['Faculty'], 'Science'); } function testView() { - + $result = $this->testAction('/departments/view/1', array( 'return' => 'vars')); + $this->assertEqual($result['title_for_layout'], 'View Department'); + $this->assertEqual($result['department'], 'MECH'); + $this->assertEqual($result['faculty'], 'Applied Science'); + $courses = $result['courses'][0]; + $courses['Department']['created'] = null; + $expected = array( + 'Course' => array( + 'id' => 1, + 'course' => 'MECH 328', + 'title' => 'Mechanical Engineering Design Project', + 'homepage' => 'http://www.mech.ubc.ca', + 'self_enroll' => 'off', + 'password' => null, + 'record_status' => 'A', + 'creator_id' => 1, + 'created' => '2006-06-20 14:14:45', + 'updater_id' => null, + 'modified' => '2006-06-20 14:14:45', + 'creator' => 'Super Admin', + 'updater' => null, + 'student_count' => 13, + 'full_name' => 'MECH 328 - Mechanical Engineering Design Project', + ), + 'CourseDepartment' => array( + 'id' => 2, + 'course_id' => 1, + 'department_id' => 1, + ), + 'Department' => array( + 'id' => 1, + 'name' => 'MECH', + 'faculty_id' => 1, + 'creator_id' => 0, + 'created' => null, + 'updater_id' => null, + 'modified' => '2012-05-23 11:30:41', + ), + ); + $this->assertEqual($courses, $expected); } function testAdd() { diff --git a/app/views/evaluations/export.ctp b/app/views/evaluations/export.ctp index 43445a0d5..e92d35275 100644 --- a/app/views/evaluations/export.ctp +++ b/app/views/evaluations/export.ctp @@ -40,6 +40,10 @@ echo $this->Form->input('eval_type', array( 'type' => 'checkbox', 'name' => 'include[eval_event_type]', 'checked' => true, 'label' => __('Include Evaluation Type', true) )); +echo $this->Form->input('export_all', array( + 'type' => 'checkbox', 'name' => 'include[export_all]', 'checked' => true, + 'label' => __('Include All Evaluations', true) +)); ?>

+ + + + + + From 4d708e8c232b705d9e071c839eb6af2f3a1eb346 Mon Sep 17 00:00:00 2001 From: Trevor Date: Tue, 17 Dec 2013 10:23:05 -0800 Subject: [PATCH 18/91] Evaluation Submission Bug Fixes This commit fixes a bug in Simple Evaluations. When allocating points in Simple Evals, the JavaScript should prevent the user from submitting if the total allocated points is greater than the required number of points. Now, when the user allocates more than the total number of points, the JavaScript will indicate that the user needs to deallocate 'X'number of points and will disable the submit button. In the 'mixeval_questions' table, when creating a Mixed Eval, nothing was being saved to the 'scale_level' column. This commit ensures that the correct value is saved in the 'scale_level' column. In addition, this commit also adds code that will prevent Mixed Evals and Simple Evals from being saved if the user removes the HTML 'disabled' part of the Submit button. I also added code that will save the correct value of Mixed Eval and Rubric questions even if the user happened to change the HTML value. Before users could potentially change the value to a large number and it would be saved to the database. Finally this commit, adds the missing test groups when running the "phing test-win" command (Windows). There are also a few updates to the Departments and Faculties Controller test cases. --- app/controllers/components/evaluation.php | 42 +++++++++++++++++-- app/controllers/mixevals_controller.php | 7 ++++ .../departments_controller.test.php | 19 +++++++-- .../controllers/faculties_controller.test.php | 40 ++++++++++++++++-- .../elements/evaluations/simple_eval_form.ctp | 2 +- build.xml | 2 + 6 files changed, 100 insertions(+), 12 deletions(-) diff --git a/app/controllers/components/evaluation.php b/app/controllers/components/evaluation.php index f7c83edbb..fd118f0dd 100644 --- a/app/controllers/components/evaluation.php +++ b/app/controllers/components/evaluation.php @@ -188,6 +188,8 @@ function saveSimpleEvaluation($params=null, $groupEvent=null, $evaluationSubmiss $this->GroupEvent = ClassRegistry::init('GroupEvent'); $this->Penalty = ClassRegistry::init('Penalty'); $this->GroupsMembers = ClassRegistry::init('GroupsMembers'); + $this->SimpleEvaluation = ClassRegistry::init('SimpleEvaluation'); + $this->Event = ClassRegistry::init('Event'); // assuming all are in the same order and same size $evaluatees = $params['form']['memberIDs']; @@ -197,6 +199,21 @@ function saveSimpleEvaluation($params=null, $groupEvent=null, $evaluationSubmiss isset($params['form']['group_id']) ? $evaluators = $this->GroupsMembers->findAllByGroupId($params['form']['group_id']) : $evaluators = ""; $evaluators = Set::extract('/GroupsMembers/user_id', $evaluators); + // If value is not within range, then don't save. + $pos = 0; + $totalPoints = 0; + foreach ($evaluatees as $value) { + $totalPoints += $points[$pos]; + $pos ++; + } + $event = $this->Event->getEventById($params['form']['event_id']); + $simpleEval = $this->SimpleEvaluation->getEvaluation($event['Event']['template_id']); + $required = $simpleEval['SimpleEvaluation']['point_per_member'] * count($evaluatees); + echo $required; + if ($totalPoints != $required) { + return false; + } + // create Evaluations for each evaluator-evaluatee pair $pos = 0; foreach ($evaluatees as $value) { @@ -211,6 +228,7 @@ function saveSimpleEvaluation($params=null, $groupEvent=null, $evaluationSubmiss $evalMarkRecord['EvaluationSimple']['grade_release'] = 0; } $evalMarkRecord['EvaluationSimple']['score'] = $points[$pos]; + $totalPoints += $points[$pos]; $evalMarkRecord['EvaluationSimple']['comment'] = $comments[$pos]; $evalMarkRecord['EvaluationSimple']['date_submitted'] = date('Y-m-d H:i:s'); @@ -603,6 +621,7 @@ function saveNGetEvalutionRubricDetail ($evalRubricId, $rubric, $targetEvaluatee { $this->EvaluationRubricDetail = ClassRegistry::init('EvaluationRubricDetail'); $totalGrade = 0; + $totalLom = count($rubric['RubricsLom']); if ($viewMode == 0) { $pos = 0; @@ -614,7 +633,14 @@ function saveNGetEvalutionRubricDetail ($evalRubricId, $rubric, $targetEvaluatee } // get total possible grade for the criteria number ($i) - isset($form[$targetEvaluatee.'criteria_points_'.$i]) ? $grade = $form[$targetEvaluatee.'criteria_points_'.$i] : $grade = ""; + foreach ($rubric['RubricsCriteria'] as $criteria) { + if ($criteria['criteria_num'] == $i) { + $multiplier = $criteria['multiplier']; + break; + } + } + $grade = isset($form['selected_lom_'.$targetEvaluatee.'_'.$i])? $form['selected_lom_'.$targetEvaluatee.'_'.$i] * ($multiplier/$totalLom) : ""; + $selectedLom = $form['selected_lom_'.$targetEvaluatee.'_'.$i]; $evalRubricDetail = $this->EvaluationRubricDetail->getByEvalRubricIdCritera($evalRubricId, $i); if (isset($evalRubricDetail)) { @@ -641,7 +667,14 @@ function saveNGetEvalutionRubricDetail ($evalRubricId, $rubric, $targetEvaluatee $form[$targetEvaluatee."selected$targetCriteria"] = ($form[$targetEvaluatee."selected$targetCriteria"] ? $form[$targetEvaluatee."selected$targetCriteria"] : 0); } - isset($form[$targetEvaluatee.'criteria_points_'.$targetCriteria]) ? $grade = $form[$targetEvaluatee.'criteria_points_'.$targetCriteria] : $grade = ""; + foreach ($rubric['RubricsCriteria'] as $criteria) { + if ($criteria['criteria_num'] == $targetCriteria) { + $multiplier = $criteria['multiplier']; + break; + } + } + $grade = isset($form['selected_lom_'.$targetEvaluatee.'_'.$targetCriteria])? $form['selected_lom_'.$targetEvaluatee.'_'.$targetCriteria] * ($multiplier/$totalLom) : ""; + $selectedLom = $form['selected_lom_'.$targetEvaluatee.'_'.$targetCriteria]; // Set up and save EvaluationRubricDetail @@ -660,7 +693,7 @@ function saveNGetEvalutionRubricDetail ($evalRubricId, $rubric, $targetEvaluatee // Loop through all criteria to get total grade foreach ($rubric['RubricsCriteria'] as $rubricCriteria) { $criteriaNum = $rubricCriteria['criteria_num']; - isset($form[$targetEvaluatee.'criteria_points_'.$criteriaNum]) ? $grade = $form[$targetEvaluatee.'criteria_points_'.$criteriaNum] : $grade = 0; + $grade = isset($form['selected_lom_'.$targetEvaluatee.'_'.$criteriaNum])? $form['selected_lom_'.$targetEvaluatee.'_'.$criteriaNum]/$totalLom : 0; $totalGrade += $grade; } } @@ -959,7 +992,8 @@ function saveNGetEvaluationMixevalDetail($evalMixevalId, $mixeval, $form) if ($ques['mixeval_question_type_id'] == '1') { $evalMixevalDetail['EvaluationMixevalDetail']['selected_lom'] = $data[$num]['selected_lom']; } - $evalMixevalDetail['EvaluationMixevalDetail']['grade'] = $data[$num]['grade']; + // Do not grab grade directly as users can edit the HTML to submit illegitimate answers + $evalMixevalDetail['EvaluationMixevalDetail']['grade'] = $data[$num]['selected_lom'] * ($ques['multiplier']/$ques['scale_level']); if ($ques['required'] && !$ques['self_eval']) { $totalGrade += $data[$num]['grade']; } diff --git a/app/controllers/mixevals_controller.php b/app/controllers/mixevals_controller.php index 463e6d529..b7d9ae041 100644 --- a/app/controllers/mixevals_controller.php +++ b/app/controllers/mixevals_controller.php @@ -322,6 +322,13 @@ public function _dataSavePrep() { $deleteSelfEval[$oldIndex] = 1; continue; } + $scaleLevel = 0; + if (isset($this->data['MixevalQuestionDesc'])) { + foreach ($this->data['MixevalQuestionDesc'] as $desc) { + $scaleLevel++; + } + } + $q['scale_level'] = $scaleLevel; $contiguousQs[$newIndex] = $q; $newOrder[$oldIndex] = $newIndex; } diff --git a/app/tests/cases/controllers/departments_controller.test.php b/app/tests/cases/controllers/departments_controller.test.php index 104c15a83..eeb584a8f 100644 --- a/app/tests/cases/controllers/departments_controller.test.php +++ b/app/tests/cases/controllers/departments_controller.test.php @@ -128,15 +128,28 @@ function testView() { } function testAdd() { - + $result = $this->testAction('/departments/add', array('return' => 'vars')); + $this->assertEqual($result['faculties'][1], 'Applied Science'); + $this->assertEqual($result['faculties'][2], 'Science'); + $this->assertEqual($result['title_for_layout'], 'Add Department'); } function testEdit() { - + $result = $this->testAction('/departments/edit/1', array('return' => 'vars')); + $this->assertEqual($result['faculties'][1], 'Applied Science'); + $this->assertEqual($result['faculties'][2], 'Science'); + $this->assertEqual($result['title_for_layout'], 'Edit Department'); } function testDelete() { - + $this->testAction('/departments/delete/1'); + $result = $this->testAction('/departments/index', array( 'return' => 'contents')); + $this->assertEqual($result['departments'][0]['id'], 2); + $this->assertEqual($result['departments'][0]['Name'], 'APSC'); + $this->assertEqual($result['departments'][0]['Faculty'], 'Applied Science'); + $this->assertEqual($result['departments'][1]['id'], 3); + $this->assertEqual($result['departments'][1]['Name'], 'CPSC'); + $this->assertEqual($result['departments'][1]['Faculty'], 'Science'); } } diff --git a/app/tests/cases/controllers/faculties_controller.test.php b/app/tests/cases/controllers/faculties_controller.test.php index 15109ae43..a6aebe102 100644 --- a/app/tests/cases/controllers/faculties_controller.test.php +++ b/app/tests/cases/controllers/faculties_controller.test.php @@ -66,11 +66,40 @@ public function getController() } function testIndex() { - + $return = $this->testAction('/faculties/index', array('return' => 'contents')); + $this->assertEqual($return['faculties'][0]['id'], 1); + $this->assertEqual($return['faculties'][0]['Name'], 'Applied Science'); + $this->assertEqual($return['faculties'][1]['id'], 2); + $this->assertEqual($return['faculties'][1]['Name'], 'Science'); } function testView() { - + $return = $this->testAction('/faculties/view/1', array('return' => 'vars')); + $this->assertEqual($return['faculty'], 'Applied Science'); + $this->assertEqual($return['departments'][0]['id'], 1); + $this->assertEqual($return['departments'][0]['Name'], 'MECH'); + $this->assertEqual($return['departments'][1]['id'], 2); + $this->assertEqual($return['departments'][1]['Name'], 'APSC'); + $this->assertEqual($return['userfaculty'][1]['id'], 2); + $this->assertEqual($return['userfaculty'][1]['Username'], 'instructor1'); + $this->assertEqual($return['userfaculty'][1]['Full Name'], 'Instructor 1'); + $this->assertEqual($return['userfaculty'][1]['Email'], 'instructor1@email'); + $this->assertEqual($return['userfaculty'][1]['Role'], 'instructor'); + $this->assertEqual($return['userfaculty'][2]['id'], 3); + $this->assertEqual($return['userfaculty'][2]['Username'], 'instructor2'); + $this->assertEqual($return['userfaculty'][2]['Full Name'], 'Instructor 2'); + $this->assertEqual($return['userfaculty'][2]['Email'], ''); + $this->assertEqual($return['userfaculty'][2]['Role'], 'instructor'); + $this->assertEqual($return['userfaculty'][3]['id'], 4); + $this->assertEqual($return['userfaculty'][3]['Username'], 'instructor3'); + $this->assertEqual($return['userfaculty'][3]['Full Name'], 'Instructor 3'); + $this->assertEqual($return['userfaculty'][3]['Email'], ''); + $this->assertEqual($return['userfaculty'][3]['Role'], 'instructor'); + $this->assertEqual($return['userfaculty'][4]['id'], 34); + $this->assertEqual($return['userfaculty'][4]['Username'], 'admin1'); + $this->assertEqual($return['userfaculty'][4]['Full Name'], 'admin1'); + $this->assertEqual($return['userfaculty'][4]['Email'], ''); + $this->assertEqual($return['userfaculty'][4]['Role'], 'admin'); } function testAdd() { @@ -78,11 +107,14 @@ function testAdd() { } function testEdit() { - + } function testDelete() { - + $this->testAction('faculties/delete/1'); + $return = $this->testAction('faculties/index', array('return' => 'contents')); + $this->assertEqual($return['faculties'][0]['id'], 2); + $this->assertEqual($return['faculties'][0]['Name'], 'Science'); } } diff --git a/app/views/elements/evaluations/simple_eval_form.ctp b/app/views/elements/evaluations/simple_eval_form.ctp index 7e1cd6b98..c3be60831 100644 --- a/app/views/elements/evaluations/simple_eval_form.ctp +++ b/app/views/elements/evaluations/simple_eval_form.ctp @@ -41,7 +41,7 @@ echo "else if (totalPoints > parseFloat(allPoints)) {"; echo " diff = totalPoints - parseFloat(allPoints);"; echo " if (commentsRequired == 0) {"; - echo " $('statusMsg').innerHTML = '".__('Too many points, need to unallocate', true)." ' + diff + ' ".__('points.')." ';"; + echo " $('statusMsg').innerHTML = '".__('Too many points, need to unallocate', true)." ' + diff + ' ".__('points.', true)." ';"; echo " }"; echo " else if (commentsRequired == 1 && emptyComments != 0) {"; echo " $('statusMsg').innerHTML = '".__('Too many points, need to unallocate', true)." ' + diff + ' ".__('points.
There are still', true)." ' + emptyComments + ' ".__(' comments to be filled.', true)." ';"; diff --git a/build.xml b/build.xml index 86243e076..d9660782e 100644 --- a/build.xml +++ b/build.xml @@ -220,6 +220,8 @@ + + From 74f2a3f508dc584d60f0e44946ad94dd95e21579 Mon Sep 17 00:00:00 2001 From: Trevor Date: Tue, 17 Dec 2013 11:32:29 -0800 Subject: [PATCH 19/91] Switched Default DB Credential from root to ipeer Same as commit: 16f1ae2cfcaf9264af7726f38e0c6144dae4f083 Using root is not safe and most people will use a separate credential for the application. --- app/config/database.php.default | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/database.php.default b/app/config/database.php.default index 01575ce22..86df0e520 100644 --- a/app/config/database.php.default +++ b/app/config/database.php.default @@ -77,8 +77,8 @@ class DATABASE_CONFIG { 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', - 'login' => 'root', - 'password' => '', + 'login' => 'ipeer', + 'password' => 'ipeer', 'database' => 'ipeer', 'prefix' => '', //'encoding' => 'utf8', From e1fd80e6695fd48b74723c57acf311a9cd81d239 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 13 Jan 2014 14:51:36 -0800 Subject: [PATCH 20/91] fixed requiring upgrade message. When we go from master to dev for example, a database upgrade is needed; so when we log into the system as a super administrator we will get a red alert message. The problem is after we have gone through the upgrade process and log back into the system, the alert message still appears. The reason is in the core, we have set the expected database version to 8 but the upgrader only upgrades to delta6a/delta6b (version 6). This was fixed by changing the upgrader to update to the same version set in the core. After doing so we have found a problem with running delta7 and delta8. The problem is they were trying to add a system parameter called "database.version", which already exists. To fix this I have modified the script to update the parameter instead. --- app/config/sql/delta_7.sql | 3 +-- app/config/sql/delta_8.sql | 3 +-- app/libs/upgrade_scripts/upgrade_310.php | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/config/sql/delta_7.sql b/app/config/sql/delta_7.sql index 8775b350a..f352d6e04 100644 --- a/app/config/sql/delta_7.sql +++ b/app/config/sql/delta_7.sql @@ -509,5 +509,4 @@ ALTER TABLE rubrics_criterias ADD show_marks INT(1) AFTER multiplier; -- Update database version, done as the very last operation as a sign that -- the update went well. -INSERT INTO `sys_parameters` (`parameter_code`, `parameter_value`, `parameter_type`, `description`, `record_status`, `creator_id`, `created`, `updater_id`, `modified`) VALUES -('database.version', '7', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()); \ No newline at end of file +UPDATE `sys_parameters` SET `parameter_value` = '7' WHERE `parameter_code` = 'database.version'; \ No newline at end of file diff --git a/app/config/sql/delta_8.sql b/app/config/sql/delta_8.sql index 72a38a2ef..2ce1ef935 100644 --- a/app/config/sql/delta_8.sql +++ b/app/config/sql/delta_8.sql @@ -5,6 +5,5 @@ ALTER TABLE rubrics ADD view_mode VARCHAR(10) AFTER criteria; -- Update database version, done as the very last operation as a sign that -- the update went well. -INSERT INTO `sys_parameters` (`parameter_code`, `parameter_value`, `parameter_type`, `description`, `record_status`, `creator_id`, `created`, `updater_id`, `modified`) VALUES -('database.version', '8', 'I', 'database version', 'A', 0, NOW(), NULL, NOW()); +UPDATE `sys_parameters` SET `parameter_value` = '8' WHERE `parameter_code` = 'database.version'; diff --git a/app/libs/upgrade_scripts/upgrade_310.php b/app/libs/upgrade_scripts/upgrade_310.php index c44604554..dd0a66a6c 100644 --- a/app/libs/upgrade_scripts/upgrade_310.php +++ b/app/libs/upgrade_scripts/upgrade_310.php @@ -24,7 +24,7 @@ public function __construct() // determines whether the upgrader will run $this->toVersion = '3.1.0'; // determines which of the delta_*.sql files will be applied - $this->dbVersion = 6; + $this->dbVersion = Configure::read('DATABASE_VERSION'); } /** From 066712cb1e4a64a29a84f6250b3467a177bb03d1 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 13 Jan 2014 16:32:18 -0800 Subject: [PATCH 21/91] fixed event model tests Some tests were broken due to the array returned being in a different order than expected. To fix it, I have ordered the the returned array before checking whether the results are correct. --- app/tests/cases/models/event.test.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/tests/cases/models/event.test.php b/app/tests/cases/models/event.test.php index 55f201b88..6e02e6e22 100644 --- a/app/tests/cases/models/event.test.php +++ b/app/tests/cases/models/event.test.php @@ -46,7 +46,7 @@ function testGetCourseEvent() $this->Event = & ClassRegistry::init('Event'); //Test a valid course number - $course = $this->Event->getCourseEvent(1); + $course = Set::sort($this->Event->getCourseEvent(1), '{n}.Event.id', 'asc'); $this->assertEqual($course[0]['Event']['title'], 'Term 1 Evaluation'); $this->assertEqual($course[1]['Event']['title'], 'Term Report Evaluation'); $this->assertEqual($course[2]['Event']['title'], 'Project Evaluation'); @@ -71,7 +71,7 @@ function testGetCourseEvalEvent() //Test a valid course number - $course = $this->Event->GetCourseEvalEvent(1); + $course = Set::sort($this->Event->GetCourseEvalEvent(1), '{n}.Event.id', 'asc'); $events = $this->toEventNameArray($course); $this->assertEqual($events['0'], 'Term 1 Evaluation'); $this->assertEqual($events['1'], 'Term Report Evaluation'); From 10ac870b2d11153681f52fed8dd4f094bf4ca5b6 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Thu, 16 Jan 2014 10:19:45 -0800 Subject: [PATCH 22/91] fixed many of the checkstyle errors --- app/controllers/components/evaluation.php | 10 +- .../components/password_generator.php | 2 +- app/controllers/courses_controller.php | 2 +- app/controllers/evaluations_controller.php | 66 +-- app/controllers/users_controller.php | 510 ++++++++++++------ app/controllers/v1_controller.php | 92 ++-- app/models/event.php | 62 +-- 7 files changed, 459 insertions(+), 285 deletions(-) diff --git a/app/controllers/components/evaluation.php b/app/controllers/components/evaluation.php index fd118f0dd..dc318f352 100644 --- a/app/controllers/components/evaluation.php +++ b/app/controllers/components/evaluation.php @@ -493,11 +493,12 @@ function formatSimpleEvaluationResult($event) * Rubric Evaluation functions * * @param mixed $event + * @param mixed $studentId * * @access public * @return void */ - function loadRubricEvaluationDetail($event, $sutdentId = null) + function loadRubricEvaluationDetail($event, $studentId = null) { $this->EvaluationRubric = new EvaluationRubric; $this->GroupsMembers = new GroupsMembers; @@ -507,7 +508,7 @@ function loadRubricEvaluationDetail($event, $sutdentId = null) $Session = new SessionComponent(); $user = $Session->read('Auth.User');//User or Admin or - $evaluator = empty($sutdentId) ? $user['id'] : $sutdentId; + $evaluator = empty($studentId) ? $user['id'] : $studentId; $result = array(); //Get Members for this evaluation $groupMembers = $this->User->getEventGroupMembersNoTutors( @@ -612,7 +613,7 @@ function saveRubricEvaluation($targetEvaluatee, $viewMode, $params=null, $target * @param mixed $targetEvaluatee target evaluatee * @param mixed $form form * @param mixed $viewMode view mode - * $param mixed $targetCriteria target criteria + * @param mixed $targetCriteria target criteria * * @access public * @return void @@ -652,7 +653,7 @@ function saveNGetEvalutionRubricDetail ($evalRubricId, $rubric, $targetEvaluatee $evalRubricDetail['EvaluationRubricDetail']['selected_lom'] = $selectedLom; $evalRubricDetail['EvaluationRubricDetail']['grade'] = $grade; - if($selectedLom != NULL){ + if($selectedLom != null){ $this->EvaluationRubricDetail->save($evalRubricDetail); } $this->EvaluationRubricDetail->id=null; @@ -880,6 +881,7 @@ function changeRubricEvaluationCommentRelease ($groupEventId, $evaluateeId, $rel * Mixeval Evaluation functions * * @param mixed $event + * @param mixed $studentId * * @access public * @return void diff --git a/app/controllers/components/password_generator.php b/app/controllers/components/password_generator.php index a16a0711e..4eee50c66 100644 --- a/app/controllers/components/password_generator.php +++ b/app/controllers/components/password_generator.php @@ -160,6 +160,6 @@ private function tryWindows($len) { * @return void */ private function defaultAlgorithm( $length = 8, $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' ) { - return substr( str_shuffle( $chars ), 0, $length ); + return substr(str_shuffle($chars), 0, $length); } } diff --git a/app/controllers/courses_controller.php b/app/controllers/courses_controller.php index 81f3c1f28..1180d7f99 100644 --- a/app/controllers/courses_controller.php +++ b/app/controllers/courses_controller.php @@ -207,7 +207,7 @@ function home($id) /** * Set all the necessary variables for the Add and Edit form elements. * - * @params mixed $courseId courseId - default null (eg. add) + * @param mixed $courseId courseId - default null (eg. add) * * @return void * */ diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index 127eb07be..b1c631669 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -329,8 +329,9 @@ function export($type, $id) /** * makeEvaluation proxy method for makeing different evaluations * - * @param mixed $eventId event id - * @param mixed $objectId object id + * @param mixed $eventId event id + * @param mixed $objectId object id + * @param mixed $studentId student id * * @access public * @return void @@ -383,8 +384,9 @@ function _sendConfirmationEmail() /** * makeSimpleEvaluation * - * @param mixed $event event object - * @param mixed $groupId group id + * @param mixed $event event object + * @param mixed $groupId group id + * @param mixed $studentId student id * * @access public * @return void @@ -397,9 +399,10 @@ function _makeSimpleEvaluation($event, $groupId, $studentId = null) if (empty($this->params['data'])) { $userId = User::get('id'); - $grpMem = $this->GroupsMembers->find('first', array( + $grpMem = $this->GroupsMembers->find('first', array( 'conditions' => array('GroupsMembers.user_id' => empty($studentId) ? $userId : $studentId, - 'GroupsMembers.group_id' => $groupId))); + 'GroupsMembers.group_id' => $groupId))); + // filter out users that don't have access to this eval, invalid ids if (empty($grpMem)) { @@ -521,7 +524,8 @@ function _makeSimpleEvaluation($event, $groupId, $studentId = null) * no persistence available unlike other forms. This is due to how we * redirect to evaluation/makeEvaluation on failure. * - * @param mixed $event event - The survey event that we're processing. + * @param mixed $event event - The survey event that we're processing. + * @param mixed $studentId student id * * @access public * @return void @@ -534,14 +538,13 @@ function _makeSurveyEvaluation ($event, $studentId = null) $userId = $this->Auth->user('id'); $courseId = $event['Event']['course_id']; if (empty($studentId)) { - // Make sure user is a student in this course - $ret = $this->UserEnrol->field('id', - array('course_id' => $courseId, 'user_id' => $userId )); - } - else { - // Make sure user is an instructor in this course - $ret = $this->UserCourse->field('id', - array('course_id' => $courseId, 'user_id' => $userId )); + // Make sure user is a student in this course + $ret = $this->UserEnrol->field('id', + array('course_id' => $courseId, 'user_id' => $userId )); + } else { + // Make sure user is an instructor in this course + $ret = $this->UserCourse->field('id', + array('course_id' => $courseId, 'user_id' => $userId )); } if (!$ret) { $this->Session->setFlash(_('Error: Invalid Id')); @@ -638,8 +641,9 @@ function _makeSurveyEvaluation ($event, $studentId = null) /** * makeRubricEvaluation * - * @param mixed $event event object - * @param mixed $groupId group id + * @param mixed $event event object + * @param mixed $groupId group id + * @param mixed $studentId student id * * @access public * @return void @@ -727,9 +731,9 @@ function _makeRubricEvaluation ($event, $groupId, $studentId = null) $this->set('allDone', $allDone); $this->set('comReq', $comReq); - if (!empty($studentId)) { - $this->set('studentId', $studentId); - } + if (!empty($studentId)) { + $this->set('studentId', $studentId); + } $this->render('rubric_eval_form'); } else { $eventId = $this->params['form']['event_id']; @@ -868,9 +872,9 @@ function completeEvaluationRubric () $evaluators = Set::extract('/GroupsMembers/user_id', $evaluators); $studentId = $this->params['form']['student_id']; - if (!empty($studentId)) { - $evaluator = $studentId; - } + if (!empty($studentId)) { + $evaluator = $studentId; + } $groupEventId = $this->params['form']['group_event_id']; //Get the target group event $groupEvent = $this->GroupEvent->getGroupEventByEventIdGroupId($eventId, $groupId); @@ -923,8 +927,9 @@ function completeEvaluationRubric () /** * makeMixevalEvaluation * - * @param mixed $event event object - * @param mixed $groupId group id + * @param mixed $event event object + * @param mixed $groupId group id + * @param mixed $studentId student id * * @access public * @return void @@ -1002,9 +1007,9 @@ function _makeMixevalEvaluation ($event, $groupId, $studentId = null) $this->set('mixeval', $mixeval); $this->set('enrol', $enrol); - if (!empty($studentId)) { - $this->set('studentId', $studentId); - } + if (!empty($studentId)) { + $this->set('studentId', $studentId); + } $this->render('mixeval_eval_form'); } else { @@ -1023,7 +1028,7 @@ function _makeMixevalEvaluation ($event, $groupId, $studentId = null) continue; // only has self-evaluation so skip } if (!empty($studentId)) { - $eval['Evaluation']['evaluator_id'] = $studentId; + $eval['Evaluation']['evaluator_id'] = $studentId; } $eventId = $eval['Evaluation']['event_id']; $groupId = $eval['Evaluation']['group_id']; @@ -1304,6 +1309,7 @@ function viewEvaluationResults($eventId, $groupId = null, $displayFormat="") * * @param int $eventId * @param int $groupId + * @param mixed $studentId * * @access public * @return void @@ -2176,4 +2182,4 @@ function viewSurveySummary($eventId) }*/ -} +} \ No newline at end of file diff --git a/app/controllers/users_controller.php b/app/controllers/users_controller.php index ba40a2215..5c5e8d5f3 100644 --- a/app/controllers/users_controller.php +++ b/app/controllers/users_controller.php @@ -686,20 +686,34 @@ public function edit($userId = null, $courseId = null) { } } - // create the enrolment entry depending on if instructor or student - // and also convert it into a CakePHP dark magic friendly format - $enrollment = explode("||", $this->data['Courses']['enrollment']); - foreach ($enrollment as $index => $val) { - $enrollment[$index] = str_replace("|", "", $val); - } - if (!empty($enrollment)) { - $enrolments = $this->_convertCourseEnrolment( - $enrollment, - $this->data['Role']['RolesUser']['role_id'] - ); - } else { - $enrolments = array('Enrolment' => array()); - } + // create the enrolment entry depending on if instructor or student + + // and also convert it into a CakePHP dark magic friendly format + + $enrollment = explode("||", $this->data['Courses']['enrollment']); + + foreach ($enrollment as $index => $val) { + + $enrollment[$index] = str_replace("|", "", $val); + + } + + if (!empty($enrollment)) { + + $enrolments = $this->_convertCourseEnrolment( + + $enrollment, + + $this->data['Role']['RolesUser']['role_id'] + + ); + + } else { + + $enrolments = array('Enrolment' => array()); + + } + $this->data = array_merge($this->data, $enrolments); // Now we actually attempt to save the data @@ -1561,177 +1575,333 @@ private function _notUnenrolCourses($editor, $userId) return array_diff($userCourses, array_keys($editorCourses)); } - /** - * formatDueIn - * - * Take the due interval, which is in seconds, and format - * it something that's easier for users to read. - * - * @param mixed $seconds seconds - * - * @access private - * @return void - */ - private function _formatDueIn($seconds) - { - $ret = ""; - if ($seconds > 86400) { - $ret = round($seconds / 86400, 1) . __(' days', true); - } - elseif ($seconds < 3600) { - $minutes = (int) ($seconds / 60); - $seconds = $seconds % 60; - $ret = $minutes . __(' minutes ', true) . $seconds - . __(' seconds', true); - } - else { - $hours = (int) ($seconds / 3600); - $minutes = (int) ($seconds % 3600 / 60); - $ret = $hours . __(' hours ', true) . $minutes . - __(' minutes', true); - } - return $ret; + /** + + * formatDueIn + + * + + * Take the due interval, which is in seconds, and format + + * it something that's easier for users to read. + + * + + * @param mixed $seconds seconds + + * + + * @access private + + * @return void + + */ + + private function _formatDueIn($seconds) + + { + + $ret = ""; + + if ($seconds > 86400) { + + $ret = round($seconds / 86400, 1) . __(' days', true); + + } + + elseif ($seconds < 3600) { + + $minutes = (int) ($seconds / 60); + + $seconds = $seconds % 60; + + $ret = $minutes . __(' minutes ', true) . $seconds + + . __(' seconds', true); + + } + + else { + + $hours = (int) ($seconds / 3600); + + $minutes = (int) ($seconds % 3600 / 60); + + $ret = $hours . __(' hours ', true) . $minutes . + + __(' minutes', true); + + } + + return $ret; + } - /** - * Helper to filter events into 3 different categories and to - * discard inactive events. - * - * The 3 categories are: Upcoming, Submitted, Expired - * - * - Upcoming are events that the user can still make submissions for. - * - Submitted are events that the user has already made a submission. - * - Expired are events that the user hasn't made and can no longer make - * submissions, but they can still view results from their peers. - * - * An evaluation is considered inactive once past its result release - * period. A survey is considered inactive once past its release period. - * - * @param array $events - list of events info returned from the event model, - * each event MUST have an 'EvaluationSubmission' array or this won't work - * - * @return Discard inactive events and then split the remaining events - * into upcoming, submitted, and expired. - * */ - private function _splitSubmittedEvents($events) - { - $submitted = $upcoming = $expired = array(); - foreach ($events as $event) { - if (empty($event['EvaluationSubmission']) && - $event['Event']['is_released'] - ) { // can only take surveys during the release period - $upcoming[] = $event; - } - else if (!empty($event['EvaluationSubmission']) && - strtotime('NOW') < - strtotime($event['Event']['result_release_date_end']) - ) { // has submission and can or will be able to view results soon - // note that we're not using is_released or is_result_released - // because of an edge case where if there is a period of time - // between the release and result release period, the evaluation - // will disappear from view - $submitted[] = $event; - } - else if (!empty($event['EvaluationSubmission']) && - $event['Event']['is_released'] - ) { - // special case for surveys, which doesn't have - // result_release_date_end - $submitted[] = $event; - } - else if (empty($event['EvaluationSubmission']) && - strtotime('NOW') < - strtotime($event['Event']['result_release_date_end']) && - strtotime('NOW') > - strtotime($event['Event']['release_date_end']) - ) { // student did not do the survey within the allowed time - // but we should still let them view results - $expired[] = $event; - } - } - return array('upcoming' => $upcoming, - 'submitted' => $submitted, - 'expired' => $expired - ); + /** + + * Helper to filter events into 3 different categories and to + + * discard inactive events. + + * + + * The 3 categories are: Upcoming, Submitted, Expired + + * + + * - Upcoming are events that the user can still make submissions for. + + * - Submitted are events that the user has already made a submission. + + * - Expired are events that the user hasn't made and can no longer make + + * submissions, but they can still view results from their peers. + + * + + * An evaluation is considered inactive once past its result release + + * period. A survey is considered inactive once past its release period. + + * + + * @param array $events - list of events info returned from the event model, + + * each event MUST have an 'EvaluationSubmission' array or this won't work + + * + + * @return Discard inactive events and then split the remaining events + + * into upcoming, submitted, and expired. + + * */ + + private function _splitSubmittedEvents($events) + + { + + $submitted = $upcoming = $expired = array(); + + foreach ($events as $event) { + + if (empty($event['EvaluationSubmission']) && + + $event['Event']['is_released'] + + ) { // can only take surveys during the release period + + $upcoming[] = $event; + + } + + else if (!empty($event['EvaluationSubmission']) && + + strtotime('NOW') < + + strtotime($event['Event']['result_release_date_end']) + + ) { // has submission and can or will be able to view results soon + + // note that we're not using is_released or is_result_released + + // because of an edge case where if there is a period of time + + // between the release and result release period, the evaluation + + // will disappear from view + + $submitted[] = $event; + + } + + else if (!empty($event['EvaluationSubmission']) && + + $event['Event']['is_released'] + + ) { + + // special case for surveys, which doesn't have + + // result_release_date_end + + $submitted[] = $event; + + } + + else if (empty($event['EvaluationSubmission']) && + + strtotime('NOW') < + + strtotime($event['Event']['result_release_date_end']) && + + strtotime('NOW') > + + strtotime($event['Event']['release_date_end']) + + ) { // student did not do the survey within the allowed time + + // but we should still let them view results + + $expired[] = $event; + + } + + } + + return array('upcoming' => $upcoming, + + 'submitted' => $submitted, + + 'expired' => $expired + + ); + } - /** - * showEvents - * - * @param mixed $id - user id - * - * @access public - * @return void - */ - function showEvents($id) + /** + + * showEvents + + * + + * @param mixed $id - user id + + * + + * @access public + + * @return void + + */ + + function showEvents($id) + { // check what type the logged in user is if(User::hasPermission('functions/superadmin')) { $extraId = null; } - else if (User::hasPermission('controllers/departments')) { + else if (User::hasPermission('controllers/departments')) { + $extraId = User::getAccessibleCourses(); } else { $extraId = User::get('id'); } - // find all the student's events the user is allowed to see - $events = $this->Event->getEventsByUserId($id, null, $extraId); - - // mark events as late if past due date - foreach ($events as &$type) { - foreach ($type as &$event) { - if ($event['Event']['due_in'] > 0) { - $event['late'] = false; - continue; - } - $event['late'] = true; - } - } - - // determine the proper penalty to be applied to a late eval - foreach ($events['Evaluations'] as &$event) { - if (!$event['late'] || empty($event['Penalty'])) { - continue; - } - // convert seconds to days - $daysLate = abs($event['Event']['due_in']) / 86400; - $pctPenalty = 0; - foreach ($event['Penalty'] as $penalty) { - $pctPenalty = $penalty['percent_penalty']; - if ($penalty['days_late'] > $daysLate) { - break; - } - } - $event['percent_penalty'] = $pctPenalty; - } - - // format the 'due in' time interval for display - foreach ($events as &$types) { - foreach ($types as &$event) { - $event['Event']['due_in'] = $this->_formatDueIn( - abs($event['Event']['due_in'])); - } - } - - // remove non-current events and split into upcoming/submitted/expired - $evals = $this->_splitSubmittedEvents($events['Evaluations']); - $surveys = $this->_splitSubmittedEvents($events['Surveys']); - - // calculate summary statistics - $numOverdue = 0; - $numDue = 0; - $numDue = sizeof($evals['upcoming']) + sizeof($surveys['upcoming']); - // only evals can have overdue events right now - foreach ($evals['upcoming'] as $e) { - $e['late'] ? $numOverdue++ : ''; - } - - + // find all the student's events the user is allowed to see + + $events = $this->Event->getEventsByUserId($id, null, $extraId); + + + + // mark events as late if past due date + + foreach ($events as &$type) { + + foreach ($type as &$event) { + + if ($event['Event']['due_in'] > 0) { + + $event['late'] = false; + + continue; + + } + + $event['late'] = true; + + } + + } + + + + // determine the proper penalty to be applied to a late eval + + foreach ($events['Evaluations'] as &$event) { + + if (!$event['late'] || empty($event['Penalty'])) { + + continue; + + } + + // convert seconds to days + + $daysLate = abs($event['Event']['due_in']) / 86400; + + $pctPenalty = 0; + + foreach ($event['Penalty'] as $penalty) { + + $pctPenalty = $penalty['percent_penalty']; + + if ($penalty['days_late'] > $daysLate) { + + break; + + } + + } + + $event['percent_penalty'] = $pctPenalty; + + } + + + + // format the 'due in' time interval for display + + foreach ($events as &$types) { + + foreach ($types as &$event) { + + $event['Event']['due_in'] = $this->_formatDueIn( + + abs($event['Event']['due_in'])); + + } + + } + + + + // remove non-current events and split into upcoming/submitted/expired + + $evals = $this->_splitSubmittedEvents($events['Evaluations']); + + $surveys = $this->_splitSubmittedEvents($events['Surveys']); + + + + // calculate summary statistics + + $numOverdue = 0; + + $numDue = 0; + + $numDue = sizeof($evals['upcoming']) + sizeof($surveys['upcoming']); + + // only evals can have overdue events right now + + foreach ($evals['upcoming'] as $e) { + + $e['late'] ? $numOverdue++ : ''; + + } + + + + + $this->set('studentId', $id); - $this->set('evals', $evals); - $this->set('surveys', $surveys); - $this->set('numOverdue', $numOverdue); + $this->set('evals', $evals); + + $this->set('surveys', $surveys); + + $this->set('numOverdue', $numOverdue); + $this->set('numDue', $numDue); $this->render('student_events'); } diff --git a/app/controllers/v1_controller.php b/app/controllers/v1_controller.php index e1285eb40..0cdd083c7 100644 --- a/app/controllers/v1_controller.php +++ b/app/controllers/v1_controller.php @@ -347,9 +347,9 @@ public function users($id = null) { $data = array(); // rearrange the data foreach ($decode as $person) { - // set the userId so the user data gets updats with values from BB - $person['id'] = $this->User->field('id', array('username' => $person['username'])); - $pRole = array('Role' => array('RolesUser' => array('role_id' => $person['role_id']))); + // set the userId so the user data gets updats with values from BB + $person['id'] = $this->User->field('id', array('username' => $person['username'])); + $pRole = array('Role' => array('RolesUser' => array('role_id' => $person['role_id']))); unset($person['role_id']); // do some clean up before we insert the values array_walk($person, create_function('&$val', '$val = trim($val);')); @@ -1000,53 +1000,49 @@ public function enrolment() { } // check if any user's role changed else { - $userId = $this->User->field('id', array('username' => $user['username'])); - if (!empty($userId)) { - $role = $this->Role->getRoleName($user['role_id']); + $userId = $this->User->field('id', array('username' => $user['username'])); + + if (!empty($userId)) { + $role = $this->Role->getRoleName($user['role_id']); - if ($role == 'instructor') { - if(in_array($userId, $students)) { - $this->User->removeStudent($userId, $courseId); - $this->log('Removing student '.$user['username'].' from course '.$courseId, 'debug'); - $ret = $this->User->addInstructor($userId, $courseId); - $this->log('Adding instructor '.$user['username'].' to course '.$courseId, 'api'); - } - else if(in_array($userId, $tutors)) { - $this->User->removeTutor($userId, $courseId); - $this->log('Removing tutor '.$user['username'].' from course '.$courseId, 'debug'); - $ret = $this->User->addInstructor($userId, $courseId); - $this->log('Adding instructor '.$user['username'].' to course '.$courseId, 'api'); - } - } - else if ($role == 'tutor') { - if(in_array($userId, $students)) { - $this->User->removeStudent($userId, $courseId); - $this->log('Removing student '.$user['username'].' from course '.$courseId, 'debug'); - $ret = $this->User->addTutor($userId, $courseId); - $this->log('Adding tutor '.$user['username'].' to course '.$courseId, 'api'); - } - else if(in_array($userId, $instructors)) { - $this->User->removeInstructor($userId, $courseId); - $this->log('Removing instructor '.$user['username'].' from course '.$courseId, 'debug'); - $ret = $this->User->addTutor($userId, $courseId); - $this->log('Adding tutor '.$user['username'].' to course '.$courseId, 'api'); - } - } - else if ($role == 'student') { - if(in_array($userId, $tutors)) { - $this->User->removeTutor($userId, $courseId); + if ($role == 'instructor') { + if(in_array($userId, $students)) { + $this->User->removeStudent($userId, $courseId); + $this->log('Removing student '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addInstructor($userId, $courseId); + $this->log('Adding instructor '.$user['username'].' to course '.$courseId, 'api'); + } else if(in_array($userId, $tutors)) { + $this->User->removeTutor($userId, $courseId); $this->log('Removing tutor '.$user['username'].' from course '.$courseId, 'debug'); - $ret = $this->User->addStudent($userId, $courseId); - $this->log('Adding student '.$user['username'].' to course '.$courseId, 'api'); - } - else if(in_array($userId, $instructors)) { - $this->User->removeInstructor($userId, $courseId); - $this->log('Removing instructor '.$user['username'].' from course '.$courseId, 'debug'); - $ret = $this->User->addStudent($userId, $courseId); - $this->log('Adding student '.$user['username'].' to course '.$courseId, 'api'); - } - } - } + $ret = $this->User->addInstructor($userId, $courseId); + $this->log('Adding instructor '.$user['username'].' to course '.$courseId, 'api'); + } + } else if ($role == 'tutor') { + if(in_array($userId, $students)) { + $this->User->removeStudent($userId, $courseId); + $this->log('Removing student '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addTutor($userId, $courseId); + $this->log('Adding tutor '.$user['username'].' to course '.$courseId, 'api'); + } else if(in_array($userId, $instructors)) { + $this->User->removeInstructor($userId, $courseId); + $this->log('Removing instructor '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addTutor($userId, $courseId); + $this->log('Adding tutor '.$user['username'].' to course '.$courseId, 'api'); + } + } else if ($role == 'student') { + if(in_array($userId, $tutors)) { + $this->User->removeTutor($userId, $courseId); + $this->log('Removing tutor '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addStudent($userId, $courseId); + $this->log('Adding student '.$user['username'].' to course '.$courseId, 'api'); + } else if(in_array($userId, $instructors)) { + $this->User->removeInstructor($userId, $courseId); + $this->log('Removing instructor '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addStudent($userId, $courseId); + $this->log('Adding student '.$user['username'].' to course '.$courseId, 'api'); + } + } + } } } // unenrol students that are no longer in the class, this will become a problem if diff --git a/app/models/event.php b/app/models/event.php index 6ed0021ee..ada49f5e3 100644 --- a/app/models/event.php +++ b/app/models/event.php @@ -673,39 +673,39 @@ function getEventFieldsByEventId($eventId, $fields) * * @param mixed $userId user id * @param mixed $fields the fields to retreive + * @param mixed $extraId * * @access public * @return array array of events with related models, e.g. course, group, submission */ function getEventsByUserId($userId, $fields = null, $extraId = null) { - ini_set('display_errors',1); - error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); + ini_set('display_errors', 1); + error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); $evaluationFields = $surveyFields = $fields; if ($evaluationFields != null) { $evaluationFields[] = 'GroupEvent.*'; } if ($extraId) { - if (is_array($extraId)) { - $courseIds = array(); - foreach ($extraId as $course) { - $courseIds[] = $course; - } - } - else { - $courses = $this->Course->getCourseByInstructor($extraId); - $courseIds = array(); - foreach ($courses as $course) { - $courseIds[] = $course['Course']['id']; - } - } - $groups = $this->Group->find('all', array( - 'fields' => 'id', - 'conditions' => array('Member.id' => $userId, 'course_id' => $courseIds), - 'contain' => array('Member', 'GroupEvent.id'))); - $groupEventIds = Set::extract('/GroupEvent/id', $groups); - } - else { + if (is_array($extraId)) { + $courseIds = array(); + foreach ($extraId as $course) { + $courseIds[] = $course; + } + } else { + $courses = $this->Course->getCourseByInstructor($extraId); + $courseIds = array(); + foreach ($courses as $course) { + $courseIds[] = $course['Course']['id']; + } + } + $groups = $this->Group->find('all', array( + 'fields' => 'id', + 'conditions' => array('Member.id' => $userId, 'course_id' => $courseIds), + 'contain' => array('Member', 'GroupEvent.id'))); + + $groupEventIds = Set::extract('/GroupEvent/id', $groups); + } else { // get the groups that this user is in $groups = $this->Group->find('all', array( 'fields' => 'id', @@ -753,14 +753,14 @@ function getEventsByUserId($userId, $fields = null, $extraId = null) } if (empty($courseIds)) { - // to find the surveys, we need to find the courses that user is enrolled in - // can't use find('list') as we are query the conditions on HABTM - $courses = $this->Course->find('all', array( - 'fields' => array('id'), - 'conditions' => array('Enrol.id' => $userId), - 'contain' => 'Enrol', - )); - $courseIds = Set::extract($courses, '/Course/id'); + // to find the surveys, we need to find the courses that user is enrolled in + // can't use find('list') as we are query the conditions on HABTM + $courses = $this->Course->find('all', array( + 'fields' => array('id'), + 'conditions' => array('Enrol.id' => $userId), + 'contain' => 'Enrol', + )); + $courseIds = Set::extract($courses, '/Course/id'); } // find survey events based on the groups this user is in $surveyEvents = $this->find('all', array( @@ -860,4 +860,4 @@ public function getEventSubmission($eventId, $userId) 'conditions' => array('EvaluationSubmission.submitter_id' => $userId) )))); } -} +} \ No newline at end of file From 821fcaef555323b21c307c21b8d6012c3b86eacf Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Thu, 16 Jan 2014 10:37:18 -0800 Subject: [PATCH 23/91] fixed more checkstyle errors in users controller --- app/controllers/users_controller.php | 397 ++++++++------------------- 1 file changed, 109 insertions(+), 288 deletions(-) diff --git a/app/controllers/users_controller.php b/app/controllers/users_controller.php index 5c5e8d5f3..8eb79ea58 100644 --- a/app/controllers/users_controller.php +++ b/app/controllers/users_controller.php @@ -687,31 +687,19 @@ public function edit($userId = null, $courseId = null) { } // create the enrolment entry depending on if instructor or student - // and also convert it into a CakePHP dark magic friendly format - $enrollment = explode("||", $this->data['Courses']['enrollment']); - foreach ($enrollment as $index => $val) { - - $enrollment[$index] = str_replace("|", "", $val); - + $enrollment[$index] = str_replace("|", "", $val); } if (!empty($enrollment)) { - - $enrolments = $this->_convertCourseEnrolment( - - $enrollment, - - $this->data['Role']['RolesUser']['role_id'] - - ); - + $enrolments = $this->_convertCourseEnrolment( + $enrollment, + $this->data['Role']['RolesUser']['role_id'] + ); } else { - - $enrolments = array('Enrolment' => array()); - + $enrolments = array('Enrolment' => array()); } $this->data = array_merge($this->data, $enrolments); @@ -1576,333 +1564,166 @@ private function _notUnenrolCourses($editor, $userId) } /** - * formatDueIn - * - * Take the due interval, which is in seconds, and format - * it something that's easier for users to read. - * - * @param mixed $seconds seconds - * - * @access private - * @return void - */ - private function _formatDueIn($seconds) - { - - $ret = ""; - - if ($seconds > 86400) { - - $ret = round($seconds / 86400, 1) . __(' days', true); - + $ret = ""; + if ($seconds > 86400) { + $ret = round($seconds / 86400, 1) . __(' days', true); + } elseif ($seconds < 3600) { + $minutes = (int) ($seconds / 60); + $seconds = $seconds % 60; + $ret = $minutes . __(' minutes ', true) . $seconds . __(' seconds', true); + } else { + $hours = (int) ($seconds / 3600); + $minutes = (int) ($seconds % 3600 / 60); + $ret = $hours . __(' hours ', true) . $minutes . __(' minutes', true); } - elseif ($seconds < 3600) { - - $minutes = (int) ($seconds / 60); - - $seconds = $seconds % 60; - - $ret = $minutes . __(' minutes ', true) . $seconds - - . __(' seconds', true); - - } - - else { - - $hours = (int) ($seconds / 3600); - - $minutes = (int) ($seconds % 3600 / 60); - - $ret = $hours . __(' hours ', true) . $minutes . - - __(' minutes', true); - - } - - return $ret; - + return $ret; } /** - * Helper to filter events into 3 different categories and to - * discard inactive events. - * - * The 3 categories are: Upcoming, Submitted, Expired - * - * - Upcoming are events that the user can still make submissions for. - * - Submitted are events that the user has already made a submission. - * - Expired are events that the user hasn't made and can no longer make - * submissions, but they can still view results from their peers. - * - * An evaluation is considered inactive once past its result release - * period. A survey is considered inactive once past its release period. - * - * @param array $events - list of events info returned from the event model, - * each event MUST have an 'EvaluationSubmission' array or this won't work - * - * @return Discard inactive events and then split the remaining events - * into upcoming, submitted, and expired. - * */ - private function _splitSubmittedEvents($events) - { + $submitted = $upcoming = $expired = array(); + + foreach ($events as $event) { + if (empty($event['EvaluationSubmission']) && $event['Event']['is_released']) { + // can only take surveys during the release period + $upcoming[] = $event; + } else if (!empty($event['EvaluationSubmission']) && + strtotime('NOW') < strtotime($event['Event']['result_release_date_end'])) { + // has submission and can or will be able to view results soon + // note that we're not using is_released or is_result_released + // because of an edge case where if there is a period of time + // between the release and result release period, the evaluation + // will disappear from view + $submitted[] = $event; + } else if (!empty($event['EvaluationSubmission']) && $event['Event']['is_released']) { + // special case for surveys, which doesn't have + // result_release_date_end + $submitted[] = $event; + } else if (empty($event['EvaluationSubmission']) && + strtotime('NOW') < + strtotime($event['Event']['result_release_date_end']) && + strtotime('NOW') > + strtotime($event['Event']['release_date_end']) + ) { // student did not do the survey within the allowed time + // but we should still let them view results + $expired[] = $event; + } + } - $submitted = $upcoming = $expired = array(); - - foreach ($events as $event) { - - if (empty($event['EvaluationSubmission']) && - - $event['Event']['is_released'] - - ) { // can only take surveys during the release period - - $upcoming[] = $event; - - } - - else if (!empty($event['EvaluationSubmission']) && - - strtotime('NOW') < - - strtotime($event['Event']['result_release_date_end']) - - ) { // has submission and can or will be able to view results soon - - // note that we're not using is_released or is_result_released - - // because of an edge case where if there is a period of time - - // between the release and result release period, the evaluation - - // will disappear from view - - $submitted[] = $event; - - } - - else if (!empty($event['EvaluationSubmission']) && - - $event['Event']['is_released'] - - ) { - - // special case for surveys, which doesn't have - - // result_release_date_end - - $submitted[] = $event; - - } - - else if (empty($event['EvaluationSubmission']) && - - strtotime('NOW') < - - strtotime($event['Event']['result_release_date_end']) && - - strtotime('NOW') > - - strtotime($event['Event']['release_date_end']) - - ) { // student did not do the survey within the allowed time - - // but we should still let them view results - - $expired[] = $event; - - } - - } - - return array('upcoming' => $upcoming, - - 'submitted' => $submitted, - - 'expired' => $expired - - ); - + return array('upcoming' => $upcoming, 'submitted' => $submitted, 'expired' => $expired); } /** - * showEvents - * - * @param mixed $id - user id - * - * @access public - * @return void - */ function showEvents($id) - { - // check what type the logged in user is - if(User::hasPermission('functions/superadmin')) { - $extraId = null; - } - else if (User::hasPermission('controllers/departments')) { - - $extraId = User::getAccessibleCourses(); - } - else { - $extraId = User::get('id'); - } - // find all the student's events the user is allowed to see - - $events = $this->Event->getEventsByUserId($id, null, $extraId); - - - - // mark events as late if past due date - - foreach ($events as &$type) { - - foreach ($type as &$event) { - - if ($event['Event']['due_in'] > 0) { - - $event['late'] = false; - - continue; - - } - - $event['late'] = true; - - } - - } - - - - // determine the proper penalty to be applied to a late eval - - foreach ($events['Evaluations'] as &$event) { - - if (!$event['late'] || empty($event['Penalty'])) { - - continue; - - } - - // convert seconds to days - - $daysLate = abs($event['Event']['due_in']) / 86400; - - $pctPenalty = 0; - - foreach ($event['Penalty'] as $penalty) { - - $pctPenalty = $penalty['percent_penalty']; - - if ($penalty['days_late'] > $daysLate) { - - break; - - } - - } - - $event['percent_penalty'] = $pctPenalty; - - } - - - - // format the 'due in' time interval for display - - foreach ($events as &$types) { - - foreach ($types as &$event) { - - $event['Event']['due_in'] = $this->_formatDueIn( - - abs($event['Event']['due_in'])); - - } - - } - - - - // remove non-current events and split into upcoming/submitted/expired - - $evals = $this->_splitSubmittedEvents($events['Evaluations']); - - $surveys = $this->_splitSubmittedEvents($events['Surveys']); - - - - // calculate summary statistics - - $numOverdue = 0; - - $numDue = 0; - - $numDue = sizeof($evals['upcoming']) + sizeof($surveys['upcoming']); - - // only evals can have overdue events right now - - foreach ($evals['upcoming'] as $e) { - - $e['late'] ? $numOverdue++ : ''; - - } + // check what type the logged in user is + if(User::hasPermission('functions/superadmin')) { + $extraId = null; + } else if (User::hasPermission('controllers/departments')) { + $extraId = User::getAccessibleCourses(); + } else { + $extraId = User::get('id'); + } + // find all the student's events the user is allowed to see + $events = $this->Event->getEventsByUserId($id, null, $extraId); + + // mark events as late if past due date + foreach ($events as &$type) { + foreach ($type as &$event) { + if ($event['Event']['due_in'] > 0) { + $event['late'] = false; + continue; + } + $event['late'] = true; + } + } - + // determine the proper penalty to be applied to a late eval + foreach ($events['Evaluations'] as &$event) { + if (!$event['late'] || empty($event['Penalty'])) { + continue; + } + // convert seconds to days + $daysLate = abs($event['Event']['due_in']) / 86400; + $pctPenalty = 0; + foreach ($event['Penalty'] as $penalty) { + $pctPenalty = $penalty['percent_penalty']; + if ($penalty['days_late'] > $daysLate) { + break; + } + } + $event['percent_penalty'] = $pctPenalty; + } - + // format the 'due in' time interval for display + foreach ($events as &$types) { + foreach ($types as &$event) { + $event['Event']['due_in'] = $this->_formatDueIn( + abs($event['Event']['due_in'])); + } + } - $this->set('studentId', $id); - $this->set('evals', $evals); + // remove non-current events and split into upcoming/submitted/expired + $evals = $this->_splitSubmittedEvents($events['Evaluations']); + $surveys = $this->_splitSubmittedEvents($events['Surveys']); + + // calculate summary statistics + $numOverdue = 0; + $numDue = 0; + $numDue = sizeof($evals['upcoming']) + sizeof($surveys['upcoming']); + // only evals can have overdue events right now + foreach ($evals['upcoming'] as $e) { + $e['late'] ? $numOverdue++ : ''; + } - $this->set('surveys', $surveys); + $this->set('studentId', $id); + $this->set('evals', $evals); - $this->set('numOverdue', $numOverdue); + $this->set('surveys', $surveys); + $this->set('numOverdue', $numOverdue); - $this->set('numDue', $numDue); - $this->render('student_events'); + $this->set('numDue', $numDue); + $this->render('student_events'); } } \ No newline at end of file From 920c131d0fcfe3be05987d520f0cafe423b604f8 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Thu, 16 Jan 2014 11:02:20 -0800 Subject: [PATCH 24/91] commented out timezone test from event model I have commented out the tests for timezone in the event model test. The tests were used to test the different timezones (eg. before DST, Transition to DST, etc). However the calculations were not redone each time the timezone changes; therefore all three test cases are comparing the same timestamp (Vancouver). Furthermore, there seems to be some slight problem with the assertWithinMargin assertion. Even though we gave it a fudge factor of 5 and the difference between the timestamps was only 1, the test cases fail. Moreover the test cases do not fail all the time. --- app/tests/cases/models/event.test.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/tests/cases/models/event.test.php b/app/tests/cases/models/event.test.php index 6e02e6e22..a1bfc6a8d 100644 --- a/app/tests/cases/models/event.test.php +++ b/app/tests/cases/models/event.test.php @@ -333,7 +333,7 @@ function testGetEventSubmission() //TODO } - function testTimezone() + /*function testTimezone() { $now = time(); // current php time (eg. not sql time) $event = $this->Event->findById(1); @@ -351,7 +351,7 @@ function testTimezone() $this->assertWithinMargin($event['Event']['due_in'], $dueIn, 5); // switch timezone back to original date_default_timezone_set($serverTZ); - } + }*/ ##################################################################################################################################################### ############################################### HELPER FUNCTIONS ############################################################################ From 1c2309edcacaa3d5c3c878bf7c1b6608135fd6d7 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Thu, 16 Jan 2014 14:05:42 -0800 Subject: [PATCH 25/91] fixed timezone test I have fixed/modified timezone test cases in the event model. Firstly, I have increased the fudge factor to 10 seconds. The reason is sometimes the computer may be slightly slower and get a result of 6 or 7 second difference which causes the tests to fail. Furthermore I have modified the test cases to use an updated $dueIn value, or else the three test cases are comparing the same values three times and not have the opportunity for the code to change the timezone. Note: the three $dueIn values for the test cases will be expected to be the same because the amount of time left to complete the evaluation should stay the same no matter which timezone we are in. --- app/controllers/evaluations_controller.php | 2 +- app/controllers/users_controller.php | 8 ++++---- app/controllers/v1_controller.php | 6 +++--- app/models/event.php | 12 ++++++------ app/tests/cases/models/event.test.php | 14 ++++++++------ 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index b1c631669..ce441835d 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -543,7 +543,7 @@ function _makeSurveyEvaluation ($event, $studentId = null) array('course_id' => $courseId, 'user_id' => $userId )); } else { // Make sure user is an instructor in this course - $ret = $this->UserCourse->field('id', + $ret = $this->UserCourse->field('id', array('course_id' => $courseId, 'user_id' => $userId )); } if (!$ret) { diff --git a/app/controllers/users_controller.php b/app/controllers/users_controller.php index 8eb79ea58..58b69540a 100644 --- a/app/controllers/users_controller.php +++ b/app/controllers/users_controller.php @@ -1583,11 +1583,11 @@ private function _formatDueIn($seconds) $minutes = (int) ($seconds / 60); $seconds = $seconds % 60; $ret = $minutes . __(' minutes ', true) . $seconds . __(' seconds', true); - } else { - $hours = (int) ($seconds / 3600); + } else { + $hours = (int) ($seconds / 3600); $minutes = (int) ($seconds % 3600 / 60); $ret = $hours . __(' hours ', true) . $minutes . __(' minutes', true); - } + } return $ret; } @@ -1649,7 +1649,7 @@ private function _splitSubmittedEvents($events) /** * showEvents * - * @param mixed $id - user id + * @param mixed $id - user id * * @access public * @return void diff --git a/app/controllers/v1_controller.php b/app/controllers/v1_controller.php index 0cdd083c7..3dbb92246 100644 --- a/app/controllers/v1_controller.php +++ b/app/controllers/v1_controller.php @@ -1004,7 +1004,7 @@ public function enrolment() { if (!empty($userId)) { $role = $this->Role->getRoleName($user['role_id']); - + if ($role == 'instructor') { if(in_array($userId, $students)) { $this->User->removeStudent($userId, $courseId); @@ -1013,8 +1013,8 @@ public function enrolment() { $this->log('Adding instructor '.$user['username'].' to course '.$courseId, 'api'); } else if(in_array($userId, $tutors)) { $this->User->removeTutor($userId, $courseId); - $this->log('Removing tutor '.$user['username'].' from course '.$courseId, 'debug'); - $ret = $this->User->addInstructor($userId, $courseId); + $this->log('Removing tutor '.$user['username'].' from course '.$courseId, 'debug'); + $ret = $this->User->addInstructor($userId, $courseId); $this->log('Adding instructor '.$user['username'].' to course '.$courseId, 'api'); } } else if ($role == 'tutor') { diff --git a/app/models/event.php b/app/models/event.php index ada49f5e3..77ea837c1 100644 --- a/app/models/event.php +++ b/app/models/event.php @@ -706,12 +706,12 @@ function getEventsByUserId($userId, $fields = null, $extraId = null) $groupEventIds = Set::extract('/GroupEvent/id', $groups); } else { - // get the groups that this user is in - $groups = $this->Group->find('all', array( - 'fields' => 'id', - 'conditions' => array('Member.id' => $userId), - 'contain' => array('Member', 'GroupEvent.id'))); - $groupEventIds = Set::extract('/GroupEvent/id', $groups); + // get the groups that this user is in + $groups = $this->Group->find('all', array( + 'fields' => 'id', + 'conditions' => array('Member.id' => $userId), + 'contain' => array('Member', 'GroupEvent.id'))); + $groupEventIds = Set::extract('/GroupEvent/id', $groups); } // find evaluation events based on the groups this user is in $evaluationEvents = $this->find('all', array( diff --git a/app/tests/cases/models/event.test.php b/app/tests/cases/models/event.test.php index a1bfc6a8d..de43e5ada 100644 --- a/app/tests/cases/models/event.test.php +++ b/app/tests/cases/models/event.test.php @@ -333,7 +333,7 @@ function testGetEventSubmission() //TODO } - /*function testTimezone() + function testTimezone() { $now = time(); // current php time (eg. not sql time) $event = $this->Event->findById(1); @@ -341,17 +341,19 @@ function testGetEventSubmission() $dueIn = $dueDate - $now; $serverTZ = date_default_timezone_get(); // saves the server's timezone // the difference between the our calculuation and the model's calcualtion - // should be within 5 seconds - $this->assertWithinMargin($event['Event']['due_in'], $dueIn, 5); + // should be within 10 seconds + $this->assertWithinMargin($event['Event']['due_in'], $dueIn, 10); // switch to timezone without daylight savings date_default_timezone_set('America/Regina'); - $this->assertWithinMargin($event['Event']['due_in'], $dueIn, 5); + $dueIn = $dueDate - time(); + $this->assertWithinMargin($event['Event']['due_in'], $dueIn, 10); // switch to timezone with daylight savings date_default_timezone_set('America/Vancouver'); - $this->assertWithinMargin($event['Event']['due_in'], $dueIn, 5); + $dueIn = $dueDate - time(); + $this->assertWithinMargin($event['Event']['due_in'], $dueIn, 10); // switch timezone back to original date_default_timezone_set($serverTZ); - }*/ + } ##################################################################################################################################################### ############################################### HELPER FUNCTIONS ############################################################################ From e7c96a7c02b45984ec8b3616116807b8eaf740ca Mon Sep 17 00:00:00 2001 From: Compass Date: Sat, 18 Jan 2014 17:17:44 -0800 Subject: [PATCH 26/91] Fix simple eval controller test crashing --- .../cases/controllers/simpleevaluations_controller.test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tests/cases/controllers/simpleevaluations_controller.test.php b/app/tests/cases/controllers/simpleevaluations_controller.test.php index 835a421fb..842f4612f 100644 --- a/app/tests/cases/controllers/simpleevaluations_controller.test.php +++ b/app/tests/cases/controllers/simpleevaluations_controller.test.php @@ -16,7 +16,7 @@ 'MockSimpleevaluationsController', array('isAuthorized', 'render', 'redirect', '_stop', 'header')); -class SimpleevaluationsControllerTest extends CakeTestCase { +class SimpleevaluationsControllerTest extends ExtendedAuthTestCase { public $controller = null; public $fixtures = array( From dd4da38cf46be9e7a17b8a27e8f174c5c1f53af0 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Fri, 17 Jan 2014 14:05:37 -0800 Subject: [PATCH 27/91] fixed the inability to view students' survey Previously if you are an administrator and have access to the course, the system still returns an error message that it is an invalid id when you are trying to access a survey. The reason is the system only checks whether you are an instructor of the course or not. To fix this problem, I have changed it to check whether the logged in user has access to the course if they are trying to access the surveys not as a student. --- app/controllers/evaluations_controller.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index 6ab5587b8..e3932ea14 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -541,9 +541,9 @@ function _makeSurveyEvaluation ($event, $studentId = null) $ret = $this->UserEnrol->field('id', array('course_id' => $courseId, 'user_id' => $userId )); } else { - // Make sure user is an instructor in this course - $ret = $this->UserCourse->field('id', - array('course_id' => $courseId, 'user_id' => $userId )); + // Make sure user has access to the course (eg. instructor, admin) + $ret = $this->Course->getAccessibleCourseById($courseId, $userId, + User::getCourseFilterPermission(), array('Instructor', 'Department')); } if (!$ret) { $this->Session->setFlash(_t('Error: Invalid Id')); From 54cb2bf4ba10220cf43902662348d82e08d6facc Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 20 Jan 2014 15:15:08 -0800 Subject: [PATCH 28/91] Fixed problem with exporting evaluation results to csv I have discovered that when we export all results from evaluation events that do not have the self evaluation option turned on, we still receive rows of empty result for self evaluation. For example, if we have no self-evaluation event and we exported all the results we still get a row that have no results (as expected) for Ed Student from Ed Student. --- .../components/export_base_new.php | 34 +++++++------------ app/controllers/evaluations_controller.php | 2 +- app/views/evaluations/export.ctp | 8 ++--- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/app/controllers/components/export_base_new.php b/app/controllers/components/export_base_new.php index 8e342c115..5fec9e989 100644 --- a/app/controllers/components/export_base_new.php +++ b/app/controllers/components/export_base_new.php @@ -148,11 +148,7 @@ function buildEvaluationScoreTableByEvent($params, $event, $results, $peerEval = * @return void */ function buildScoreTableByEvaluatee($params, $group, $evaluatee, $event, $responses, $subDate, $peerEval) - { - // Export all determines whether or not to export all results - // including those that don't have values. - ($params['include']['export_all'] == 1) ? $exportAll = true : $exportAll = false; - + { // Build grid //$xPosition = 0; //$yPosition = 0; @@ -165,9 +161,14 @@ function buildScoreTableByEvaluatee($params, $group, $evaluatee, $event, $respon foreach ($group['Member'] as $evaluator) { if (!$peerEval && $evaluator['id'] != $evaluatee['id']) { - continue; // skip peer evaluations for self-evaluation + continue; // skip peer evaluations for self-evaluation section + } + + if (!$event['Event']['self_eval'] && $evaluator['id'] == $evaluatee['id']) { + continue; // skip self-eval when self-evaluation is not set in event } + //TODO: change the condition to not depend on Role's name, which can change if ($evaluatee['Role']['name'] == 'tutor') { continue; // skip evaluations where the tutor is the evaluatee } @@ -203,24 +204,15 @@ function buildScoreTableByEvaluatee($params, $group, $evaluatee, $event, $respon array_push($row, $evaluator['student_no']); } - // check if we have a reponse for this evaluator - if ($exportAll == true) { - // Show all users - if (!isset($responses[$evaluatee['id']]) || !array_key_exists($evaluator['id'], $responses[$evaluatee['id']])) { - $emptyCount = $xDimension - count($row); - for ($i = 0; $i < $emptyCount; $i++) { - array_push($row, ''); - } + /* Export all determines whether or not to export all results + including those that don't have values. */ + if (!isset($responses[$evaluatee['id']]) || !array_key_exists($evaluator['id'], $responses[$evaluatee['id']])) { + if ($params['include']['export_all']) { + $row += array_fill(count($row), $xDimension - count($row), ''); $grid[] = $row; $yInc++; - continue; - } - } - else { - // Don't show all users - if (!isset($responses[$evaluatee['id']]) || !array_key_exists($evaluator['id'], $responses[$evaluatee['id']])) { - continue; } + continue; } $response = $responses[$evaluatee['id']][$evaluator['id']]; diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index e3932ea14..e53d6b8bb 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -1082,7 +1082,7 @@ function _makeMixevalEvaluation ($event, $groupId, $studentId = null) $evaluationSubmission['EvaluationSubmission']['date_submitted'] = date('Y-m-d H:i:s'); $evaluationSubmission['EvaluationSubmission']['submitted'] = 1; if (!$this->EvaluationSubmission->save($evaluationSubmission)) { - $this->Session->setFlash(__('Error: Unable to submit the evaluation. Please try again.', truej)); + $this->Session->setFlash(__('Error: Unable to submit the evaluation. Please try again.', true)); } } diff --git a/app/views/evaluations/export.ctp b/app/views/evaluations/export.ctp index e92d35275..9c8f01e0d 100644 --- a/app/views/evaluations/export.ctp +++ b/app/views/evaluations/export.ctp @@ -22,6 +22,10 @@ $evaluations = ($fromEvent) ? array($selectedEvent['Event']['id'] => $selectedEv echo $this->Form->input('event_id', array( 'name' => 'event_id', 'options' => $evaluations, 'label' => 'Event Name' )); +echo $this->Form->input('export_all', array( + 'type' => 'checkbox', 'name' => 'include[export_all]', 'checked' => true, + 'label' => __('Include All Evaluations', true) +)); ?>

Form->input('eval_type', array( 'type' => 'checkbox', 'name' => 'include[eval_event_type]', 'checked' => true, 'label' => __('Include Evaluation Type', true) )); -echo $this->Form->input('export_all', array( - 'type' => 'checkbox', 'name' => 'include[export_all]', 'checked' => true, - 'label' => __('Include All Evaluations', true) -)); ?>

Date: Thu, 23 Jan 2014 14:26:11 -0800 Subject: [PATCH 29/91] added a new permission called submitstudenteval This permission is to allow or deny admins and instructors respectively from submitting evaluations and surveys for the students --- app/vendors/shells/create_acl.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/vendors/shells/create_acl.php b/app/vendors/shells/create_acl.php index c3ff8cb07..e52564c66 100644 --- a/app/vendors/shells/create_acl.php +++ b/app/vendors/shells/create_acl.php @@ -169,6 +169,11 @@ function __buildAcoFunctions() // some users can't explicitly see username $this->Acl->Aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'alias' => 'viewusername')); $this->Acl->Aco->save(); + + // functions/submitstudenteval + // allow users to submit evaluation/survey for students in student view + $this->Acl->Aco->create(array('parent_id' => $root['Aco']['id'], 'model' => null, 'alias' => 'submitstudenteval')); + $this->Acl->Aco->save(); } @@ -507,6 +512,7 @@ function createPermissions() $this->Acl->allow($role, 'functions/viewusername'); $this->Acl->allow($role, 'functions/coursemanager'); $this->Acl->deny($role, 'functions/superadmin'); + $this->Acl->allow($role, 'functions/submitstudenteval'); $role->id = 3; // instructor $this->Acl->deny($role, 'controllers'); @@ -546,6 +552,7 @@ function createPermissions() $this->Acl->deny($role, 'functions/viewemailaddresses'); $this->Acl->deny($role, 'functions/superadmin'); $this->Acl->allow($role, 'functions/coursemanager'); + $this->Acl->deny($role, 'functions/submitstudenteval'); $role->id = 4; // tutor $this->Acl->deny($role, 'controllers'); From a1f09e079108d31e045fa475fff45aabd1f20fe2 Mon Sep 17 00:00:00 2001 From: Compass Date: Fri, 31 Jan 2014 17:11:38 -0800 Subject: [PATCH 30/91] Fix API return 404 when no department is setup When no department is setup, the return value should be empty array [], instead of 404. --- app/controllers/v1_controller.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/controllers/v1_controller.php b/app/controllers/v1_controller.php index 28b1dacbf..101fea3a8 100644 --- a/app/controllers/v1_controller.php +++ b/app/controllers/v1_controller.php @@ -829,11 +829,8 @@ public function departments($departmentId = null) foreach ($dps as $dp) { $departments[] = $dp['Department']; } - $statusCode = 'HTTP/1.1 200 OK'; - } else { - $departments = null; - $statusCode = 'HTTP/1.1 404 Not Found'; } + $statusCode = 'HTTP/1.1 200 OK'; } else { $courseDepts = $this->CourseDepartment->find('list', array('conditions' => array('department_id' => $departmentId), From fad9be8759948a859811cf9deffd31e0e1cdd725 Mon Sep 17 00:00:00 2001 From: Compass Date: Tue, 4 Feb 2014 09:56:26 -0800 Subject: [PATCH 31/91] Fix missing Content-length in response of API call When the Content-length header is missing from the response, web server will treat response as dynamic length response and will insert the "Transfer-Encoding: chunked" in response header and may insert extra numbers in the beginning and ending of the response body. If the client couldn't handle chunked transfer encoding (http://en.wikipedia.org/wiki/Chunked_transfer_encoding), the parsing will fail. --- app/views/v1/error.ctp | 6 ++++-- app/views/v1/json.ctp | 1 + app/views/v1/oauth_error.ctp | 6 ++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/views/v1/error.ctp b/app/views/v1/error.ctp index 20150c643..bd05ee750 100644 --- a/app/views/v1/error.ctp +++ b/app/views/v1/error.ctp @@ -1,4 +1,6 @@ log(json_encode($error)); -echo json_encode($error); +$error_str = json_encode($error); +header("Content-length: ".strlen($error_str)); +$this->log($error_str); +echo $error_str; diff --git a/app/views/v1/json.ctp b/app/views/v1/json.ctp index 8862ace01..74ce16143 100644 --- a/app/views/v1/json.ctp +++ b/app/views/v1/json.ctp @@ -5,6 +5,7 @@ $result = array(); } $json = json_encode($result); + header("Content-length: ".strlen($json)); $this->log("Return: $json", 'api'); echo $json; diff --git a/app/views/v1/oauth_error.ctp b/app/views/v1/oauth_error.ctp index 898f73c1e..4568f885a 100644 --- a/app/views/v1/oauth_error.ctp +++ b/app/views/v1/oauth_error.ctp @@ -2,5 +2,7 @@ header('HTTP/1.1 400 Bad Request '); $error = array('code' => 100, "message" => 'OAuth error: '.$oauthError); -echo json_encode($error); -?> +$error_str = json_encode($error); +header("Content-length: ".strlen($error_str)); +$this->log($error_str); +echo $error_str; From f73925e11dcb95c9f8332e080b6ca53ed507ffbc Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 17 Feb 2014 14:00:00 -0800 Subject: [PATCH 32/91] Vagrant setup Committing submodules and scripts required to successfully setup a Vagrant virtual environment in VirtualBox. --- .gitmodules | 33 +++++++++ Vagrantfile | 131 ++++++++++++++++++++++++++++++++++++ bootstrap.sh | 1 + puppet/manifests/default.pp | 13 ++++ puppet/modules/apt | 1 + puppet/modules/concat | 1 + puppet/modules/db | 1 + puppet/modules/firewall | 1 + puppet/modules/git | 1 + puppet/modules/ipeer | 1 + puppet/modules/mysql | 1 + puppet/modules/nginx | 1 + puppet/modules/php | 1 + puppet/modules/stdlib | 1 + puppet/modules/vcsrepo | 1 + 15 files changed, 189 insertions(+) create mode 100644 Vagrantfile create mode 100755 bootstrap.sh create mode 100644 puppet/manifests/default.pp create mode 160000 puppet/modules/apt create mode 160000 puppet/modules/concat create mode 160000 puppet/modules/db create mode 160000 puppet/modules/firewall create mode 160000 puppet/modules/git create mode 160000 puppet/modules/ipeer create mode 160000 puppet/modules/mysql create mode 160000 puppet/modules/nginx create mode 160000 puppet/modules/php create mode 160000 puppet/modules/stdlib create mode 160000 puppet/modules/vcsrepo diff --git a/.gitmodules b/.gitmodules index 439dfb3c5..90f06a74c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,36 @@ [submodule "app/plugins/extended_test_case"] path = app/plugins/extended_test_case url = https://github.com/jeremyharris/extended_test_case.git +[submodule "puppet/modules/ipeer"] + path = puppet/modules/ipeer + url = https://github.com/ubc/puppet-ipeer.git +[submodule "puppet/modules/stdlib"] + path = puppet/modules/stdlib + url = https://github.com/puppetlabs/puppetlabs-stdlib.git +[submodule "puppet/modules/vcsrepo"] + path = puppet/modules/vcsrepo + url = https://github.com/puppetlabs/puppetlabs-vcsrepo.git +[submodule "puppet/modules/git"] + path = puppet/modules/git + url = https://github.com/theforeman/puppet-git.git +[submodule "puppet/modules/apt"] + path = puppet/modules/apt + url = https://github.com/puppetlabs/puppetlabs-apt.git +[submodule "puppet/modules/firewall"] + path = puppet/modules/firewall + url = https://github.com/puppetlabs/puppetlabs-firewall.git +[submodule "puppet/modules/mysql"] + path = puppet/modules/mysql + url = https://github.com/puppetlabs/puppetlabs-mysql.git +[submodule "puppet/modules/php"] + path = puppet/modules/php + url = https://github.com/thias/puppet-php.git +[submodule "nginx"] + path = puppet/modules/nginx + url = https://github.com/ubc/puppet-nginx.git +[submodule "concat"] + path = puppet/modules/concat + url = https://github.com/puppetlabs/puppetlabs-concat.git +[submodule "puppet/modules/db"] + path = puppet/modules/db + url = https://github.com/ubc/puppet-db.git diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 000000000..ec415a772 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,131 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# Vagrantfile API/syntax version. Don't touch unless you know what you're doing! +VAGRANTFILE_API_VERSION = "2" + +Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| + # All Vagrant configuration is done here. The most common configuration + # options are documented and commented below. For a complete reference, + # please see the online documentation at vagrantup.com. + + # Every Vagrant virtual environment requires a box to build off of. + config.vm.box = "ipeerbox3" + + config.vm.box_url = "http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box" + + config.vm.provision "puppet" do |puppet| + puppet.manifests_path = "puppet/manifests" + puppet.manifest_file = "default.pp" + puppet.module_path = "puppet/modules" + end + + config.vm.provision :shell, :path => "bootstrap.sh" + + config.vm.network :forwarded_port, host: 8080, guest: 80 + + # The url from where the 'config.vm.box' box will be fetched if it + # doesn't already exist on the user's system. + # config.vm.box_url = "http://domain.com/path/to/above.box" + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # config.vm.network :forwarded_port, guest: 80, host: 8080 + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network :private_network, ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network :public_network + + # If true, then any SSH connections made will enable agent forwarding. + # Default value: false + # config.ssh.forward_agent = true + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + config.vm.synced_folder ".", "/var/www", id: "vagrant-root", + mount_options: ["dmode=777,fmode=666"] + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + # config.vm.provider :virtualbox do |vb| + # # Don't boot with headless mode + # vb.gui = true + # + # # Use VBoxManage to customize the VM. For example to change memory: + # vb.customize ["modifyvm", :id, "--memory", "1024"] + # end + # + # View the documentation for the provider you're using for more + # information on available options. + + # Enable provisioning with Puppet stand alone. Puppet manifests + # are contained in a directory path relative to this Vagrantfile. + # You will need to create the manifests directory and a manifest in + # the file base.pp in the manifests_path directory. + # + # An example Puppet manifest to provision the message of the day: + # + # # group { "puppet": + # # ensure => "present", + # # } + # # + # # File { owner => 0, group => 0, mode => 0644 } + # # + # # file { '/etc/motd': + # # content => "Welcome to your Vagrant-built virtual machine! + # # Managed by Puppet.\n" + # # } + # + # config.vm.provision :puppet do |puppet| + # puppet.manifests_path = "manifests" + # puppet.manifest_file = "site.pp" + # end + + # Enable provisioning with chef solo, specifying a cookbooks path, roles + # path, and data_bags path (all relative to this Vagrantfile), and adding + # some recipes and/or roles. + # + # config.vm.provision :chef_solo do |chef| + # chef.cookbooks_path = "../my-recipes/cookbooks" + # chef.roles_path = "../my-recipes/roles" + # chef.data_bags_path = "../my-recipes/data_bags" + # chef.add_recipe "mysql" + # chef.add_role "web" + # + # # You may also specify custom JSON attributes: + # chef.json = { :mysql_password => "foo" } + # end + + # Enable provisioning with chef server, specifying the chef server URL, + # and the path to the validation key (relative to this Vagrantfile). + # + # The Opscode Platform uses HTTPS. Substitute your organization for + # ORGNAME in the URL and validation key. + # + # If you have your own Chef Server, use the appropriate URL, which may be + # HTTP instead of HTTPS depending on your configuration. Also change the + # validation key to validation.pem. + # + # config.vm.provision :chef_client do |chef| + # chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME" + # chef.validation_key_path = "ORGNAME-validator.pem" + # end + # + # If you're using the Opscode platform, your validator client is + # ORGNAME-validator, replacing ORGNAME with your organization name. + # + # If you have your own Chef Server, the default validation client name is + # chef-validator, unless you changed the configuration. + # + # chef.validation_client_name = "ORGNAME-validator" +end diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 000000000..6ad94285d --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1 @@ +mysql -u ipeer -pipeer -h `hostname` ipeer < /var/www/app/config/sql/ipeer_samples_data.sql \ No newline at end of file diff --git a/puppet/manifests/default.pp b/puppet/manifests/default.pp new file mode 100644 index 000000000..bb140bc41 --- /dev/null +++ b/puppet/manifests/default.pp @@ -0,0 +1,13 @@ +include ipeer::web +include ipeer::db + +ipeer::instance { ipeerdev : + server_domain => "localhost", + doc_base => "/var/www", + db_host => $fqdn +} + +file { "/etc/nginx/conf.d/default.conf" : + ensure => absent, + notify => Service["nginx"] +} \ No newline at end of file diff --git a/puppet/modules/apt b/puppet/modules/apt new file mode 160000 index 000000000..3b42983b9 --- /dev/null +++ b/puppet/modules/apt @@ -0,0 +1 @@ +Subproject commit 3b42983b9dee930130976d8eb360a5777049de76 diff --git a/puppet/modules/concat b/puppet/modules/concat new file mode 160000 index 000000000..dfb06479d --- /dev/null +++ b/puppet/modules/concat @@ -0,0 +1 @@ +Subproject commit dfb06479df3267c77081fd9d18c6c6e7dcbeea17 diff --git a/puppet/modules/db b/puppet/modules/db new file mode 160000 index 000000000..72f7ea6d4 --- /dev/null +++ b/puppet/modules/db @@ -0,0 +1 @@ +Subproject commit 72f7ea6d406e10c53c1ba61810cc5a2f1a7e7add diff --git a/puppet/modules/firewall b/puppet/modules/firewall new file mode 160000 index 000000000..d949af09c --- /dev/null +++ b/puppet/modules/firewall @@ -0,0 +1 @@ +Subproject commit d949af09c43bd0fa56a480f21e587eac45179a75 diff --git a/puppet/modules/git b/puppet/modules/git new file mode 160000 index 000000000..0ff5eb535 --- /dev/null +++ b/puppet/modules/git @@ -0,0 +1 @@ +Subproject commit 0ff5eb535369c61f484d50317c9ba6d7505e308e diff --git a/puppet/modules/ipeer b/puppet/modules/ipeer new file mode 160000 index 000000000..57583f1c8 --- /dev/null +++ b/puppet/modules/ipeer @@ -0,0 +1 @@ +Subproject commit 57583f1c8e6810d4dd99fb8f3ac28aff8f3d090d diff --git a/puppet/modules/mysql b/puppet/modules/mysql new file mode 160000 index 000000000..1bc459d05 --- /dev/null +++ b/puppet/modules/mysql @@ -0,0 +1 @@ +Subproject commit 1bc459d05bb43c5937fae6e65b7c77659432c76b diff --git a/puppet/modules/nginx b/puppet/modules/nginx new file mode 160000 index 000000000..0803f4eeb --- /dev/null +++ b/puppet/modules/nginx @@ -0,0 +1 @@ +Subproject commit 0803f4eeb50e29239cc2c4533d2e1dd17d03b136 diff --git a/puppet/modules/php b/puppet/modules/php new file mode 160000 index 000000000..c9b4fc9f4 --- /dev/null +++ b/puppet/modules/php @@ -0,0 +1 @@ +Subproject commit c9b4fc9f456bfa2ee1d687dc941495e3a95aef97 diff --git a/puppet/modules/stdlib b/puppet/modules/stdlib new file mode 160000 index 000000000..ab981422a --- /dev/null +++ b/puppet/modules/stdlib @@ -0,0 +1 @@ +Subproject commit ab981422a67636441f1bfebaaade36aa690f1f25 diff --git a/puppet/modules/vcsrepo b/puppet/modules/vcsrepo new file mode 160000 index 000000000..50079b581 --- /dev/null +++ b/puppet/modules/vcsrepo @@ -0,0 +1 @@ +Subproject commit 50079b58192ed7a2af1ba6756f75084bc74d33e8 From e6f658e95f1d0461864bf9e4fa4c06218f879d63 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 17 Feb 2014 14:31:56 -0800 Subject: [PATCH 33/91] modified Vagrantfile The modification to the Vagrantfile sets the application in a development mode where changes in the code are reflected instantaneously without having to restart the server. --- Vagrantfile | 1 + puppet/modules/apt | 2 +- puppet/modules/concat | 2 +- puppet/modules/firewall | 2 +- puppet/modules/ipeer | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index ec415a772..72070ba92 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -18,6 +18,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| puppet.manifests_path = "puppet/manifests" puppet.manifest_file = "default.pp" puppet.module_path = "puppet/modules" + puppet.options = "--environment development" end config.vm.provision :shell, :path => "bootstrap.sh" diff --git a/puppet/modules/apt b/puppet/modules/apt index 3b42983b9..a797bd741 160000 --- a/puppet/modules/apt +++ b/puppet/modules/apt @@ -1 +1 @@ -Subproject commit 3b42983b9dee930130976d8eb360a5777049de76 +Subproject commit a797bd7412745ce244e7da0c91d65f1595a8d519 diff --git a/puppet/modules/concat b/puppet/modules/concat index dfb06479d..24906d1bc 160000 --- a/puppet/modules/concat +++ b/puppet/modules/concat @@ -1 +1 @@ -Subproject commit dfb06479df3267c77081fd9d18c6c6e7dcbeea17 +Subproject commit 24906d1bca3f8a1b93b24d71c0e081eda57afc9e diff --git a/puppet/modules/firewall b/puppet/modules/firewall index d949af09c..863bbed2a 160000 --- a/puppet/modules/firewall +++ b/puppet/modules/firewall @@ -1 +1 @@ -Subproject commit d949af09c43bd0fa56a480f21e587eac45179a75 +Subproject commit 863bbed2aa0f9a9ee4c1f961de466963d3451c1e diff --git a/puppet/modules/ipeer b/puppet/modules/ipeer index 57583f1c8..96d91979d 160000 --- a/puppet/modules/ipeer +++ b/puppet/modules/ipeer @@ -1 +1 @@ -Subproject commit 57583f1c8e6810d4dd99fb8f3ac28aff8f3d090d +Subproject commit 96d91979d7734fa3f45d3243bc8f6bbf224650cc From e4281b196a23706d0606d008c4f604536021ad30 Mon Sep 17 00:00:00 2001 From: Compass Date: Mon, 17 Feb 2014 16:45:45 -0800 Subject: [PATCH 34/91] Add gitignore .vagrant directory --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 761ae9621..59fc03a8d 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ cache.properties lint.cache tags .project +.vagrant From 3a99afb952463154aa82b8c5f60cd55d2b7f8e55 Mon Sep 17 00:00:00 2001 From: Compass Date: Mon, 17 Feb 2014 17:07:09 -0800 Subject: [PATCH 35/91] Rearranged the provision files --- Vagrantfile | 8 ++++---- bootstrap.sh => puppet/bootstrap.sh | 0 puppet/{manifests/default.pp => dev.pp} | 0 3 files changed, 4 insertions(+), 4 deletions(-) rename bootstrap.sh => puppet/bootstrap.sh (100%) rename puppet/{manifests/default.pp => dev.pp} (100%) diff --git a/Vagrantfile b/Vagrantfile index 72070ba92..0e612f0c1 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -10,18 +10,18 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # please see the online documentation at vagrantup.com. # Every Vagrant virtual environment requires a box to build off of. - config.vm.box = "ipeerbox3" + config.vm.box = "ipeerbox" config.vm.box_url = "http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box" config.vm.provision "puppet" do |puppet| - puppet.manifests_path = "puppet/manifests" - puppet.manifest_file = "default.pp" + puppet.manifests_path = "puppet" + puppet.manifest_file = "dev.pp" puppet.module_path = "puppet/modules" puppet.options = "--environment development" end - config.vm.provision :shell, :path => "bootstrap.sh" + config.vm.provision :shell, :path => "puppet/bootstrap.sh" config.vm.network :forwarded_port, host: 8080, guest: 80 diff --git a/bootstrap.sh b/puppet/bootstrap.sh similarity index 100% rename from bootstrap.sh rename to puppet/bootstrap.sh diff --git a/puppet/manifests/default.pp b/puppet/dev.pp similarity index 100% rename from puppet/manifests/default.pp rename to puppet/dev.pp From 6a56928209cd5e3667e1ade4e1f9d7f6e1e73cdf Mon Sep 17 00:00:00 2001 From: Compass Date: Mon, 17 Feb 2014 17:23:19 -0800 Subject: [PATCH 36/91] Give the dev vagrant VM a name: ipeerdev --- Vagrantfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Vagrantfile b/Vagrantfile index 0e612f0c1..0206cd4ea 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -14,6 +14,9 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box_url = "http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box" + config.vm.define "ipeerdev" do |t| + end + config.vm.provision "puppet" do |puppet| puppet.manifests_path = "puppet" puppet.manifest_file = "dev.pp" From 38d56fe5eaa1f670095cec7d606fd8c315ee6e58 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Tue, 18 Feb 2014 16:02:51 -0800 Subject: [PATCH 37/91] Vagrant setup + update readme I have added installation of the oauth php extension and other plugins to allow tests to work. Currently the majority of the tests work on both the browser and terminal (phing) except for v1_controller which only works on the terminal. I will be working on a solutin for the tests to run on the browser. I have also updated readme with instructions to create and use the vagrant virtual environment. --- Vagrantfile | 2 +- build.xml | 4 ++-- puppet/bootstrap.sh | 16 +++++++++++++++- puppet/dev.pp | 17 ++++++++++++++++- readme.md | 22 ++++++++++++++++++++++ 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index 0206cd4ea..799354c5b 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -26,7 +26,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.provision :shell, :path => "puppet/bootstrap.sh" - config.vm.network :forwarded_port, host: 8080, guest: 80 + config.vm.network :forwarded_port, host: 8080, guest: 2000 # The url from where the 'config.vm.box' box will be fetched if it # doesn't already exist on the user's system. diff --git a/build.xml b/build.xml index d9660782e..e4a2eafee 100644 --- a/build.xml +++ b/build.xml @@ -212,8 +212,8 @@
- - + + diff --git a/puppet/bootstrap.sh b/puppet/bootstrap.sh index 6ad94285d..6467418d9 100755 --- a/puppet/bootstrap.sh +++ b/puppet/bootstrap.sh @@ -1 +1,15 @@ -mysql -u ipeer -pipeer -h `hostname` ipeer < /var/www/app/config/sql/ipeer_samples_data.sql \ No newline at end of file +# import sample data into database named ipeer +mysql -u ipeer -pipeer -h `hostname` ipeer < /var/www/app/config/sql/ipeer_samples_data.sql + +# install oauth php extension required for tests +yum -y install php-devel +yum -y install pcre-devel +pecl install oauth +echo 'extension=oauth.so' > /etc/php.d/oauth.ini + +# install phing +pear channel-discover pear.phing.info +pear install phing/phing + +# restart server +sudo service php-fpm restart diff --git a/puppet/dev.pp b/puppet/dev.pp index bb140bc41..bb0ff20d2 100644 --- a/puppet/dev.pp +++ b/puppet/dev.pp @@ -1,10 +1,25 @@ include ipeer::web include ipeer::db +include git ipeer::instance { ipeerdev : server_domain => "localhost", doc_base => "/var/www", - db_host => $fqdn + db_host => $fqdn, + port => 2000 +} + +# create ipeer_test database for tests +if ! defined(Mysql::Db["ipeer_test"]) { + @@mysql::db { "ipeer_test": + user => $db_username, + password => $db_password, + host => "ipeer_test" ? { + 'localhost' => "ipeer_test", + default => $fqdn, + }, + grant => ['ALL'], + } } file { "/etc/nginx/conf.d/default.conf" : diff --git a/readme.md b/readme.md index 53871d8c5..1924147a6 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,25 @@ +Running Virtual Development Server +--------------------------- +Virtual Environment Setup: + +1) Install VirtualBox at http://virtualbox.org +2) Install Vagrant at http://www.vagrantup.com/downloads +3) Go to the iPeer root directory in the terminal +4) Initial the submodules: git submodule init +5) Update the submodules: git submodule update +6) Create a Vagrant box: vagrant box add ipeerbox http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box +7) Install Virtual Box Guest Addition plugin: vagrant plugin install vagrant-vbguest +8) Start the virtual server: vagrant up +9) Go to localhost:2000 in your browser. + +Running Tests: + +1) ssh into the virtual environment: vagrant ssh +2) Go to the application’s root directory: cd /var/www +3) Run tests: phing test + +For more vagrant commands go to http://docs.vagrantup.com/v2/cli/index.html. + Running Tests --------------------------- Integration Tests From 5535254cd2312411aaba307bfd9a1c11e5f37216 Mon Sep 17 00:00:00 2001 From: Compass Date: Tue, 18 Feb 2014 23:43:49 -0800 Subject: [PATCH 38/91] Disable the local_config generating when running vagrant So that it will not override the developers custom local config --- puppet/dev.pp | 11 ++++++----- puppet/modules/firewall | 2 +- puppet/modules/ipeer | 2 +- puppet/modules/mysql | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/puppet/dev.pp b/puppet/dev.pp index bb0ff20d2..ebfbbdcf9 100644 --- a/puppet/dev.pp +++ b/puppet/dev.pp @@ -6,7 +6,8 @@ server_domain => "localhost", doc_base => "/var/www", db_host => $fqdn, - port => 2000 + port => 2000, + local_config => false, } # create ipeer_test database for tests @@ -15,9 +16,9 @@ user => $db_username, password => $db_password, host => "ipeer_test" ? { - 'localhost' => "ipeer_test", - default => $fqdn, - }, + 'localhost' => "ipeer_test", + default => $fqdn, + }, grant => ['ALL'], } } @@ -25,4 +26,4 @@ file { "/etc/nginx/conf.d/default.conf" : ensure => absent, notify => Service["nginx"] -} \ No newline at end of file +} diff --git a/puppet/modules/firewall b/puppet/modules/firewall index 863bbed2a..1b870e27a 160000 --- a/puppet/modules/firewall +++ b/puppet/modules/firewall @@ -1 +1 @@ -Subproject commit 863bbed2aa0f9a9ee4c1f961de466963d3451c1e +Subproject commit 1b870e27acfc20aedc82f8f8a178b56d17aeb30c diff --git a/puppet/modules/ipeer b/puppet/modules/ipeer index 96d91979d..53885d95f 160000 --- a/puppet/modules/ipeer +++ b/puppet/modules/ipeer @@ -1 +1 @@ -Subproject commit 96d91979d7734fa3f45d3243bc8f6bbf224650cc +Subproject commit 53885d95fc8a9f3262847d1604191057288b2b6a diff --git a/puppet/modules/mysql b/puppet/modules/mysql index 1bc459d05..84fc716b2 160000 --- a/puppet/modules/mysql +++ b/puppet/modules/mysql @@ -1 +1 @@ -Subproject commit 1bc459d05bb43c5937fae6e65b7c77659432c76b +Subproject commit 84fc716b24bf6aa37f8997f0afcccaf262176e52 From eb1605e987235bb543e1365249ba5e6599e4c0bd Mon Sep 17 00:00:00 2001 From: Compass Date: Tue, 18 Feb 2014 23:56:14 -0800 Subject: [PATCH 39/91] Remove the orphan entries in mixeval_question_descs --- app/config/sql/delta_6b.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/config/sql/delta_6b.sql b/app/config/sql/delta_6b.sql index f68733859..03d9b4acd 100644 --- a/app/config/sql/delta_6b.sql +++ b/app/config/sql/delta_6b.sql @@ -6,6 +6,9 @@ ALTER TABLE mixeval_question_descs DROP FOREIGN KEY mixeval_question_descs_ibfk_1; ALTER TABLE mixeval_question_descs DROP KEY question_num; + +-- Remove the orphan records before adding the foreign key so that it will not fail. +DELETE FROM mixeval_question_descs WHERE question_id NOT IN (SELECT id FROM mixeval_questions); ALTER TABLE mixeval_question_descs ADD FOREIGN KEY (`question_id`) REFERENCES `mixeval_questions` (`id`) ON DELETE CASCADE; ALTER TABLE simple_evaluations ADD UNIQUE KEY `name` (`name`); From ee8d406194c6d4f95c1f1cf854a3aca0e2c2210f Mon Sep 17 00:00:00 2001 From: Compass Date: Thu, 20 Feb 2014 17:07:22 -0800 Subject: [PATCH 40/91] Update translation file, removed _t function and add phing task _t function will cause cake extract task to ignore those strings. All the strings has to use __() function in order to be scanned by cake i18n task. Also added a phing task "extract" to update the translation file. --- app/app_controller.php | 15 - app/controllers/accesses_controller.php | 30 +- app/controllers/courses_controller.php | 68 +- app/controllers/evaluations_controller.php | 158 +- app/controllers/groups_controller.php | 36 +- app/controllers/install_controller.php | 2 +- app/controllers/mixevals_controller.php | 18 +- app/controllers/surveygroups_controller.php | 12 +- app/locale/default.pot | 4284 +++++++++-------- app/views/accesses/view.ctp | 22 +- app/views/courses/edit.ctp | 8 +- .../elements/evaluations/mixeval_details.ctp | 16 +- .../elements/evaluations/simple_eval_form.ctp | 13 +- .../elements/mixevals/questions_editor.ctp | 72 +- app/views/elements/users/merge_search.ctp | 12 +- app/views/evaluations/mixeval_eval_form.ctp | 36 +- app/views/evaluations/rubric_eval_form.ctp | 4 +- ...student_view_rubric_evaluation_results.ctp | 4 +- app/views/evaluations/survey_eval_form.ctp | 10 +- app/views/events/add.ctp | 6 +- app/views/events/edit.ctp | 4 +- app/views/faculties/view.ctp | 2 +- app/views/groups/import.ctp | 8 +- app/views/groups/import_results.ctp | 38 +- app/views/mixevals/view.ctp | 6 +- app/views/pages/admin.ctp | 2 +- build.xml | 5 + 27 files changed, 2643 insertions(+), 2248 deletions(-) diff --git a/app/app_controller.php b/app/app_controller.php index 809ed8626..6bb7039c4 100644 --- a/app/app_controller.php +++ b/app/app_controller.php @@ -13,21 +13,6 @@ App::import('Lib', 'toolkit'); App::import('Lib', 'breadcrumb'); -/** - * _t - * because CakePHP 1.3's internationalization __() call is stupid and wants - * you to pass an extra parameter for no reason to get a string, use this - * instead. - * - * @param mixed $str - * - * @access public - * @return void - */ -function _t($str) { - return __($str, true); -} - /** * AppController the base controller * diff --git a/app/controllers/accesses_controller.php b/app/controllers/accesses_controller.php index c9876d125..99e4fe9a6 100644 --- a/app/controllers/accesses_controller.php +++ b/app/controllers/accesses_controller.php @@ -11,7 +11,7 @@ class AccessesController extends AppController { public $name = 'Accesses'; public $uses = array('Access', 'Role'); - + /** * view * @@ -24,20 +24,20 @@ public function view($roleId=1) { $roles = $this->Role->find('list'); if (!in_array($roleId, array_keys($roles))) { - $this->Session->setFlash(_t('Error: Invalid Id.')); - $this->redirect('view'); + $this->Session->setFlash(__('Error: Invalid Id.', true)); + $this->redirect('view'); } - + $acos = $this->Acl->Aco->find('threaded'); $group_aro = $this->Acl->Aro->find('threaded', array('conditions'=>array('Aro.foreign_key'=>$roleId, 'Aro.model'=>'Role'))); $permissions = $this->Access->loadPermissions($acos, $group_aro); - + $this->set('roles', $roles); $this->set('roleId', $roleId); $this->set('permissions', $permissions); $this->set('title_for_layout', 'Permissions Editor > '.$roles[$roleId]); } - + /** * edit * @@ -54,21 +54,21 @@ public function edit($access, $acoId, $aroId, $action='all') $permission = $this->Access->find('first', array( 'conditions' => array('aro_id' => $aroId, 'aco_id' => $acoId) )); - + $aco = $this->Acl->Aco->findById($acoId); $aro = $this->Acl->Aro->findById($aroId); $accesses = array('allow', 'deny'); if (!$aco || !$aro || !in_array($access, $accesses)) { - $this->Session->setFlash(_t('Error: Updating Permissions failed.')); + $this->Session->setFlash(__('Error: Updating Permissions failed.', true)); $this->redirect('view/'.$aroId); } - + // check acoId and aroId exists, check $access is valid - + $newEntry = empty($permission) ? true : false; $actions = array('create', 'read', 'update', 'delete'); $access = ($access == 'deny') ? -1 : 1; - + // create a new entry that deny or allow all actions if ($newEntry && $action == 'all') { $permission['aro_id'] = $aroId; @@ -107,12 +107,12 @@ public function edit($access, $acoId, $aroId, $action='all') $permission['_'.$action] = $access; } $permission = array('Access' => $permission); - + if (!empty($permission) && $this->Access->save($permission)) { - $this->Session->setFlash(_t('Permissions have been updated'), 'good'); + $this->Session->setFlash(__('Permissions have been updated', true), 'good'); } else { - $this->Session->setFlash(_t('Error: Updating Permissions failed.')); + $this->Session->setFlash(__('Error: Updating Permissions failed.', true)); } $this->redirect('view/'.$aroId); } -} \ No newline at end of file +} diff --git a/app/controllers/courses_controller.php b/app/controllers/courses_controller.php index 1180d7f99..bfe40ce57 100644 --- a/app/controllers/courses_controller.php +++ b/app/controllers/courses_controller.php @@ -30,7 +30,7 @@ function __construct() $this->set('title_for_layout', 'Courses'); parent::__construct(); } - + /** * beforeFilter * @@ -240,7 +240,7 @@ public function _initFormEnv($courseId = 0) { $this->set('statusOptions', $statusOptions); $this->set('departments', $departments); - + $currentProf = $this->User->getInstructorsByCourse($courseId); $currentProf = Set::combine($currentProf, '{n}.User.id', '{n}.User.full_name'); $instructorList = $currentProf + array_diff($instructorList, $currentProf); @@ -310,7 +310,7 @@ public function edit($courseId) if (!empty($this->data)) { $this->data['Course'] = array_map('trim', $this->data['Course']); - $newInstructors = (!isset($this->data['Instructor'])) ? array() : + $newInstructors = (!isset($this->data['Instructor'])) ? array() : $this->data['Instructor']['Instructor']; // delete instructors from the course if they are not in the new list $instructors = $this->UserCourse->findAllByCourseId($courseId); @@ -332,7 +332,7 @@ public function edit($courseId) $course['Instructor']['Instructor'] = Set::extract('/Instructor/id', $course); $tutors = $this->UserTutor->findAllByCourseId($courseId); $course['Tutor']['Tutor'] = Set::extract('/UserTutor/user_id', $tutors); - + $this->data = $course; $this->set('breadcrumb', $this->breadcrumb->push(array('course' => $course['Course']))->push(__('Edit Course', true))); } @@ -369,7 +369,7 @@ function delete($id) } $this->redirect('index'); } - + /** * move * @@ -377,7 +377,7 @@ function delete($id) * @return void */ function move() - { + { if (!empty($this->data)) { $data = $this->data['Course']; $move = $data['action']; @@ -394,7 +394,7 @@ function move() $data['sourceSurveys'], $data['submitters']); $inputs = $this->SurveyInput->getByEventIdUserId( $data['sourceSurveys'], $data['submitters']); - + // if choose to copy set id to null if (!$move) { $sub['EvaluationSubmission']['id'] = null; @@ -414,21 +414,21 @@ function move() $student = $this->User->field('full_name'); $this->Course->id = $data['destCourses']; $to = $this->Course->field('full_name'); - + $msg = ''; if ($this->EvaluationSubmission->save($sub) && $this->SurveyInput->saveAll($sInputs)) { - $msg = $student.' was successfully '.$action.' to '.$to.'.'; + $msg = sprintf(__('%s was successfully %s to %s.', true), $student, $action, $to); } else { - $this->Session->setFlash(__($student.' was not successfully '.$action.' to '.$from.'.', true)); + $this->Session->setFlash(sprintf(__('%s was not successfully %s to %s.', true), $student, $action, $from)); $this->redirect('move'); return; } - + // if student is not enrolled in destination course - enrol them $enrol = $this->Course->getAccessibleCourseById($data['destCourses'], $data['submitters'], Course::FILTER_PERMISSION_ENROLLED); if (!$enrol) { if (!$this->User->addStudent($data['submitters'], $data['destCourses'])) { - $msg .= ' '.$student.' was unsuccessfully enrolled to '.$to.'.'; + $msg .= sprintf(__(' %s was unsuccessfully enrolled to %s.', true), $student, $to); } } @@ -436,14 +436,14 @@ function move() $this->Course->id = $data['sourceCourses']; $from = $this->Course->field('full_name'); if (!$this->User->removeStudent($data['submitters'], $data['sourceCourses'])) { - $msg .= ' '.$student.' was unsuccessfully unenrolled from '.$from.'.'; + $msg .= sprintf(__(' %s was unsuccessfully unenrolled from %s.', true), $student, $from); } } - $this->Session->setFlash(__($msg, true), 'good'); + $this->Session->setFlash($msg, 'good'); } // clear data when user is redirected back to this page $this->data = null; - + $sourceCourses = $this->Course->getAccessibleCourses(User::get('id'), User::getCourseFilterPermission(), 'list'); $sourceEvents = $this->Event->getActiveSurveyEvents(array_keys($sourceCourses)); $courseIds = array_unique(Set::extract('/Event/course_id', $sourceEvents)); @@ -463,8 +463,8 @@ function move() * * @access public * @return void - */ - function ajax_options() + */ + function ajax_options() { if (!$this->RequestHandler->isAjax()) { $this->cakeError('error404'); @@ -500,7 +500,7 @@ function ajax_options() asort($options); $this->set('options', $options); } - + /** * import * @@ -523,8 +523,8 @@ function import() $data = $this->data['Course']; $move = $data['action']; $field = $data['identifiers']; - $fieldText = ($field == 'student_no') ? 'student number' : 'username'; - + $fieldText = ($field == 'student_no') ? __('student number', true) : __('username', true); + // create a copy of the source survey else grab destSurveys id if (isset($data['sourceSurveys'])) { if ($data['surveyChoices']) { @@ -541,7 +541,7 @@ function import() $destEventId = $data['destSurveys']; } } - + $error = array(); $success = array(); $users = array(); @@ -551,10 +551,10 @@ function import() 'contain' => array('Role') )); } - + $invalid = array_diff($identifiers, Set::extract('/User/'.$field, $users)); foreach ($invalid as $inv) { - $error[$inv] = __('No student with '.$fieldText.' '.$inv.' exists.', true); + $error[$inv] = sprintf(__('No student with %s %s exists.', true), $fieldText, $inv); } $enrolled = $this->UserEnrol->findAllByCourseId($data['sourceCourses']); $enrolled = Set::extract('/UserEnrol/user_id', $enrolled); @@ -603,7 +603,7 @@ function import() } if (!($this->EvaluationSubmission->save($sub) && $this->SurveyInput->saveAll($sInputs))) { $error[$identifier] = __("The student's survey submission could not be transferred, however they are enrolled in the destination course.", true); - continue; + continue; } } } @@ -616,27 +616,27 @@ function import() $success[$identifier] .= __(' However they were unsuccessfully unenrolled from the source course.', true); } } else if (!in_array($user['User']['id'], $enrolled)) { - $success[$identifier] .= __(' However no student with '.$fieldText.' '.$identifier.' was enrolled in the source course.', true); - } - + $success[$identifier] .= sprintf(__(' However no student with %s %s was enrolled in the source course.', true), $fieldText, $identifier); + } + if ($move && isset($submission[$user['User']['id']])) { $success[$identifier] .= "\n".__("The student has already submitted a peer evaluation in the source course.", true); - } - + } + if (isset($data['sourceSurveys']) && !empty($destSub) && $sub) { - $success[$identifier] .= "\n".__("The student has already submitted to the + $success[$identifier] .= "\n".__("The student has already submitted to the destination survey, therefore the survey submission from the source survey was not transferred.", true); } - + } $this->set('errors', $error); $this->set('success', $success); $this->set('courseId', $data['destCourses']); - $this->set('identifier', __(ucwords($fieldText), true)); + $this->set('identifier', ucwords($fieldText)); $this->FileUpload->removeFile($uploadFile); $this->render('import_summary'); } - + $destCourses = $this->Course->getAccessibleCourses(User::get('id'), User::getCourseFilterPermission(), 'list'); //$sourceEvents = $this->Event->getActiveSurveyEvents(array_keys($destCourses)); //$courseIds = array_unique(Set::extract('/Event/course_id', $sourceEvents)); @@ -648,7 +648,7 @@ function import() $this->set('destCourses', $destCourses); $this->set('destSurveys', array()); } - + /** * addInstructor diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index e53d6b8bb..77d7b5196 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -36,7 +36,7 @@ class EvaluationsController extends AppController function __construct() { $this->Sanitize = new Sanitize; - $this->set('title_for_layout', _t('Evaluations')); + $this->set('title_for_layout', __('Evaluations', true)); parent::__construct(); } @@ -69,7 +69,7 @@ function _postProcess($data) (($completedEvaluations == $totalMembers) ? "green_check.gif" : "red_x.gif") . "'>   $completedEvaluations / $totalMembers "; - $custom['results'] = _t('Results'); + $custom['results'] = __('Results', true); // Include missing submissions into the lates $lates = $this->GroupEvent->getLateGroupMembers($groupEventID) + @@ -79,9 +79,9 @@ function _postProcess($data) $eventIsNowLate = $this->Event->checkIfNowLate($eventID); if ($eventIsNowLate) { - $custom['lates'] = ($lates > 0) ? " $lates "._t("Late") : _t("No Lates"); + $custom['lates'] = ($lates > 0) ? " $lates ".__("Late", true) : __("No Lates", true); } else { - $custom['lates'] = _t("Not Yet"); + $custom['lates'] = __("Not Yet", true); } $data[$key]['!Custom'] = $custom; @@ -111,20 +111,20 @@ function setUpAjaxList ($eventId) // Model columns (Display Title) (Type Description) array("GroupEvent.id", "", "", "hidden"), array("Group.id", "", "", "hidden"), - array("Group.group_num", _t("Group #"), "7em", "action", "View Group"), - array("Group.group_name", _t("Group Name"), "auto", "action", "View Results"), - array("!Custom.completion", _t("Completed"), "6em", "string"), - array("!Custom.results", _t("View"), "4em", "action", "View Results"), - array("!Custom.lates", _t("Late?"), "7em", "action", "View Submission"), + array("Group.group_num", __("Group #", true), "7em", "action", "View Group"), + array("Group.group_name", __("Group Name", true), "auto", "action", "View Results"), + array("!Custom.completion", __("Completed", true), "6em", "string"), + array("!Custom.results", __("View", true), "4em", "action", "View Results"), + array("!Custom.lates", __("Late?", true), "7em", "action", "View Submission"), // Release and mark status - array("GroupEvent.marked", _t("Status"), "7em", "map", - array("not reviewed" => _t("Not Reviewed"), "to review" => "To Review", - "reviewed" => _t("Reviewed"))), - array("GroupEvent.grade_release_status",_t("Grade"), "7em", "map", - array("None" => _t("Not Released"), "Some" => _t("Some Released"), "All" => _t("Released"))), - array("GroupEvent.comment_release_status", _t("Comment"), "7em", "map", - array("None" => _t("Not Released"), "Some" => _t("Some Released"), "All" => _t("Released"))), + array("GroupEvent.marked", __("Status", true), "7em", "map", + array("not reviewed" => __("Not Reviewed", true), "to review" => "To Review", + "reviewed" => __("Reviewed", true))), + array("GroupEvent.grade_release_status",__("Grade", true), "7em", "map", + array("None" => __("Not Released", true), "Some" => __("Some Released", true), "All" => __("Released", true))), + array("GroupEvent.comment_release_status", __("Comment", true), "7em", "map", + array("None" => __("Not Released", true), "Some" => __("Some Released", true), "All" => __("Released", true))), // Extra info about course and Event array("Event.id", "", "", "hidden"), @@ -138,11 +138,11 @@ function setUpAjaxList ($eventId) $actions = array( // parameters to cakePHP controller:, // display name, (warning shown), fixed parameters or Column ids - array(_t("View Results"), "", "", "", "viewEvaluationResults", "Event.id", "Group.id"), - array(_t("View Submission"), "", "", "", "viewGroupSubmissionDetails", "Event.id", "Group.id"), - array(_t("View Group"), "", "", "groups", "view", "Group.id"), - array(_t("View Event"), "", "", "events", "view", "Event.id"), - array(_t("Edit Event"), "", "", "events", "edit", "Event.id"), + array(__("View Results", true), "", "", "", "viewEvaluationResults", "Event.id", "Group.id"), + array(__("View Submission", true), "", "", "", "viewGroupSubmissionDetails", "Event.id", "Group.id"), + array(__("View Group", true), "", "", "groups", "view", "Group.id"), + array(__("View Event", true), "", "", "events", "view", "Event.id"), + array(__("Edit Event", true), "", "", "events", "edit", "Event.id"), ); $recursive = 0; @@ -188,7 +188,7 @@ function view($eventId = null) if (!($event = $this->Event->getAccessibleEventById($eventId, User::get('id'), User::getCourseFilterPermission(), array('Course')))) { - $this->Session->setFlash(_t('Error: Invalid id or you do not have permission to access this event.')); + $this->Session->setFlash(__('Error: Invalid id or you do not have permission to access this event.', true)); $this->redirect('index'); return; } @@ -208,7 +208,7 @@ function view($eventId = null) $this->set('data', $event); $this->set('breadcrumb', $this->breadcrumb->push(array('course' => $event['Course'])) ->push(array('event' => $event['Event'])) - ->push(_t('Results'))); + ->push(__('Results', true))); } // =-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=- @@ -241,7 +241,7 @@ function export($type, $id) $this->redirect('/courses'); return; } else if (!is_numeric($id)) { - $this->Session->setFlash(_t('Error: Invalid id')); + $this->Session->setFlash(__('Error: Invalid id', true)); $this->redirect('/courses'); return; } @@ -256,7 +256,7 @@ function export($type, $id) $course = $this->Course->getAccessibleCourseById($courseId, User::get('id'), User::getCourseFilterPermission()); if (!$course) { - $this->Session->setFlash(_t('Error: Course does not exist or you do not have permission to view this course.')); + $this->Session->setFlash(__('Error: Course does not exist or you do not have permission to view this course.', true)); $this->redirect('/courses'); return; } @@ -272,7 +272,7 @@ function export($type, $id) $course = $this->Course->getAccessibleCourseById($courseId, User::get('id'), User::getCourseFilterPermission()); if (!$course) { - $this->Session->setFlash(_t('Error: Course does not exist or you do not have permission to view this course.')); + $this->Session->setFlash(__('Error: Course does not exist or you do not have permission to view this course.', true)); $this->redirect('/courses'); return; } @@ -280,7 +280,7 @@ function export($type, $id) $selectedEvent = $this->Event->getEventById($id); if ($selectedEvent['Event']['event_template_type_id'] == '3') { - $this->Session->setFlash(_t('Error: Invalid Id')); + $this->Session->setFlash(__('Error: Invalid Id', true)); $this->redirect('/courses'); return; } @@ -290,14 +290,14 @@ function export($type, $id) } $this->set('id', $id); - $this->set('breadcrumb', $this->breadcrumb->push(_t('Export Evaluation Results'))); + $this->set('breadcrumb', $this->breadcrumb->push(__('Export Evaluation Results', true))); //do stuff if (isset($this->params['form']) && !empty($this->params['form'])) { $this->autoRender = false; if (!($event = $this->Event->getAccessibleEventById($this->params['form']['event_id'], User::get('id'), User::getCourseFilterPermission(), array('Course' => array('Instructor'), 'GroupEvent', 'EventTemplateType', 'Penalty' => array('order' => array('days_late ASC')))))) { - $this->Session->setFlash(_t('Error: That event does not exist or you dont have access to it')); + $this->Session->setFlash(__('Error: That event does not exist or you dont have access to it', true)); $this->redirect('index'); return; } @@ -339,7 +339,7 @@ function export($type, $id) function makeEvaluation($eventId, $objectId = null, $studentId = null) { // invalid event ids if (!is_numeric($eventId) || null == ($event = $this->Event->getEventById($eventId))) { - $this->Session->setFlash(_t('Error: Invalid Id')); + $this->Session->setFlash(__('Error: Invalid Id', true)); $this->redirect('/home/index'); return; } @@ -405,7 +405,7 @@ function _makeSimpleEvaluation($event, $groupId, $studentId = null) // filter out users that don't have access to this eval, invalid ids if (empty($grpMem)) { - $this->Session->setFlash(_t('Error: Invalid Id')); + $this->Session->setFlash(__('Error: Invalid Id', true)); $this->redirect('/home/index'); return; } @@ -414,7 +414,7 @@ function _makeSimpleEvaluation($event, $groupId, $studentId = null) // students can't submit outside of release date range if ($now < strtotime($event['Event']['release_date_begin']) || $now > strtotime($event['Event']['release_date_end'])) { - $this->Session->setFlash(_t('Error: Evaluation is unavailable')); + $this->Session->setFlash(__('Error: Evaluation is unavailable', true)); $this->redirect('/home/index'); return; } @@ -447,7 +447,7 @@ function _makeSimpleEvaluation($event, $groupId, $studentId = null) //Setup the courseId to session $this->set('courseId', $event['Event']['course_id']); $courseId = $event['Event']['course_id']; - $this->set('title_for_layout', $this->Course->getCourseName($courseId, 'S')._t(' > Evaluate Peers')); + $this->set('title_for_layout', $this->Course->getCourseName($courseId, 'S').__(' > Evaluate Peers', true)); //Set userId, first_name, last_name $this->set('userId', empty($studentId) ? $userId : $studentId); @@ -481,7 +481,7 @@ function _makeSimpleEvaluation($event, $groupId, $studentId = null) // check that all points given are not negative numbers $minimum = min($this->params['form']['points']); if ($minimum < 0) { - $this->Session->setFlash(_t('One or more of your group members have negative points. Please use positive numbers.')); + $this->Session->setFlash(__('One or more of your group members have negative points. Please use positive numbers.', true)); $this->redirect("/evaluations/makeEvaluation/$eventId/$groupId"); return; } @@ -502,13 +502,13 @@ function _makeSimpleEvaluation($event, $groupId, $studentId = null) $this->EvaluationSubmission->id = $evaluationSubmission['EvaluationSubmission']['id']; if ($this->Evaluation->saveSimpleEvaluation($this->params, $groupEvent, $evaluationSubmission)) { - $this->Session->setFlash(_t('Your Evaluation was submitted successfully.'), 'good'); + $this->Session->setFlash(__('Your Evaluation was submitted successfully.', true), 'good'); $this->redirect('/home/index/', true); } else { //Found error //Validate the error why the Event->save() method returned false $this->validateErrors($this->Event); - $this->set('errmsg', _t('Save Evaluation failure.')); + $this->set('errmsg', __('Save Evaluation failure.', true)); $this->redirect("/evaluations/makeEvaluation/$eventId/$groupId"); }//end if } @@ -542,11 +542,11 @@ function _makeSurveyEvaluation ($event, $studentId = null) array('course_id' => $courseId, 'user_id' => $userId )); } else { // Make sure user has access to the course (eg. instructor, admin) - $ret = $this->Course->getAccessibleCourseById($courseId, $userId, + $ret = $this->Course->getAccessibleCourseById($courseId, $userId, User::getCourseFilterPermission(), array('Instructor', 'Department')); } if (!$ret) { - $this->Session->setFlash(_t('Error: Invalid Id')); + $this->Session->setFlash(__('Error: Invalid Id', true)); $this->redirect('/home/index'); return; } @@ -554,7 +554,7 @@ function _makeSurveyEvaluation ($event, $studentId = null) $now = time(); if ($now < strtotime($event['Event']['release_date_begin']) || $now > strtotime($event['Event']['release_date_end'])) { - $this->Session->setFlash(_t('Error: Survey is unavailable')); + $this->Session->setFlash(__('Error: Survey is unavailable', true)); $this->redirect('/home/index'); return; } @@ -564,7 +564,7 @@ function _makeSurveyEvaluation ($event, $studentId = null) getEvalSubmissionByEventIdSubmitter($eventId, $userId); if (!empty($sub)) { $this->Session->setFlash( - _t('Error: Survey has already been submitted')); + __('Error: Survey has already been submitted', true)); $this->redirect('/home/index'); return; } @@ -613,12 +613,12 @@ function _makeSurveyEvaluation ($event, $studentId = null) $this->EvaluationSubmission->save($sub) ) { $this->Session->setFlash( - _t('Your survey was submitted successfully!'), 'good'); + __('Your survey was submitted successfully!', true), 'good'); $this->redirect('/home/index/'); return; } else { $this->Session->setFlash( - _t('Survey save failed, please try again.')); + __('Survey save failed, please try again.', true)); $this->redirect('evaluations/makeEvaluation/'.$eventId); return; } @@ -626,7 +626,7 @@ function _makeSurveyEvaluation ($event, $studentId = null) // Display questions $this->set('title_for_layout', - $this->Course->getCourseName($courseId, 'S')._t(' > Survey')); + $this->Course->getCourseName($courseId, 'S').__(' > Survey', true)); // Get all required data from each table for every question $this->set('questions', $this->Survey->getQuestions($surveyId)); @@ -673,7 +673,7 @@ function _makeRubricEvaluation ($event, $groupId, $studentId = null) if ($now < strtotime($event['Event']['release_date_begin']) || $now > strtotime($event['Event']['release_date_end'])) { - $this->Session->setFlash(_t('Error: Evaluation is unavailable')); + $this->Session->setFlash(__('Error: Evaluation is unavailable', true)); $this->redirect('/home/index'); return; } @@ -697,7 +697,7 @@ function _makeRubricEvaluation ($event, $groupId, $studentId = null) $rubric = $this->Rubric->getRubricById($rubricId); $rubricEvalViewData = $this->Rubric->compileViewData($rubric); $this->set('viewData', $rubricEvalViewData); - $this->set('title_for_layout', $this->Course->getCourseName($courseId, 'S')._t(' > Evaluate Peers')); + $this->set('title_for_layout', $this->Course->getCourseName($courseId, 'S').__(' > Evaluate Peers', true)); $rubricDetail = $this->Evaluation->loadRubricEvaluationDetail($event, $studentId); $this->set('groupMembers', $rubricDetail['groupMembers']); @@ -764,13 +764,13 @@ function _makeRubricEvaluation ($event, $groupId, $studentId = null) $msg = array(); $sub = $this->EvaluationSubmission->getEvalSubmissionByEventIdGroupIdSubmitter($eventId, $groupId, User::get('id')); if ($event['Event']['com_req'] && (count($filter) < count($comments))) { - $msg[] = 'some comments are missing'; + $msg[] = __('some comments are missing', true); } if (empty($sub)) { - $msg[] = 'you still have to submit the evaluation with the Submit button below'; + $msg[] = __('you still have to submit the evaluation with the Submit button below', true); } $suffix = empty($msg) ? '.' : ', but '.implode(' and ', $msg).'.'; - $this->Session->setFlash(__('Your evaluation has been saved'.$suffix, true)); + $this->Session->setFlash(__('Your evaluation has been saved', true).$suffix); $this->redirect('/evaluations/makeEvaluation/'.$eventId.'/'.$groupId); return; } else { @@ -816,13 +816,13 @@ function _makeRubricEvaluation ($event, $groupId, $studentId = null) $msg = array(); $sub = $this->EvaluationSubmission->getEvalSubmissionByEventIdGroupIdSubmitter($eventId, $groupId, User::get('id')); if ($event['Event']['com_req'] && (count($filter) < count($comments))) { - $msg[] = 'some comments are missing'; + $msg[] = __('some comments are missing', true); } if (empty($sub)) { - $msg[] = 'you still have to submit the evaluation with the Submit button below'; + $msg[] = __('you still have to submit the evaluation with the Submit button below', true); } $suffix = empty($msg) ? '.' : ', but '.implode(' and ', $msg).'.'; - $this->Session->setFlash(__('Your evaluation has been saved'.$suffix, true)); + $this->Session->setFlash(__('Your evaluation has been saved', true).$suffix); } else { //Found error //Validate the error why the Event->save() method returned false @@ -913,7 +913,7 @@ function completeEvaluationRubric () } if ($status) { - $this->Session->setFlash(_t('Your Evaluation was submitted successfully.'), 'good'); + $this->Session->setFlash(__('Your Evaluation was submitted successfully.', true), 'good'); $this->redirect('/home/index/', true); return; } else { @@ -942,7 +942,7 @@ function _makeMixevalEvaluation ($event, $groupId, $studentId = null) // invalid group id if (!is_numeric($groupId)) { - $this->Session->setFlash(_t('Error: Invalid Id')); + $this->Session->setFlash(__('Error: Invalid Id', true)); $this->redirect('/home/index'); return; } @@ -960,7 +960,7 @@ function _makeMixevalEvaluation ($event, $groupId, $studentId = null) // if group id provided does not match the group id the user belongs to if (!in_array($groupId, $group)) { - $this->Session->setFlash(_t('Error: Invalid Id')); + $this->Session->setFlash(__('Error: Invalid Id', true)); $this->redirect('/home/index'); return; } @@ -971,7 +971,7 @@ function _makeMixevalEvaluation ($event, $groupId, $studentId = null) if ($now < strtotime($event['Event']['release_date_begin']) || $now > strtotime($event['Event']['release_date_end'])) { - $this->Session->setFlash(_t('Error: Evaluation is unavailable')); + $this->Session->setFlash(__('Error: Evaluation is unavailable', true)); $this->redirect('/home/index'); return; } @@ -993,7 +993,7 @@ function _makeMixevalEvaluation ($event, $groupId, $studentId = null) $this->set('members', count($members)); //Setup the courseId to session $this->set('courseId', $event['Event']['course_id']); - $this->set('title_for_layout', $this->Course->getCourseName($courseId, 'S')._t(' > Evaluate Peers')); + $this->set('title_for_layout', $this->Course->getCourseName($courseId, 'S').__(' > Evaluate Peers', true)); $this->set('groupMembers', $this->Evaluation->loadMixEvaluationDetail($event)); $self = $this->EvaluationMixeval->find('first', array( 'conditions' => array('evaluator' => $userId, 'evaluatee' => $userId, 'event_id' => $eventId) @@ -1099,24 +1099,24 @@ function _makeMixevalEvaluation ($event, $groupId, $studentId = null) $this->GroupEvent->id = $groupEventId; $groupEvent['GroupEvent']['marked'] = 'to review'; if (!$this->GroupEvent->save($groupEvent)) { - $this->Session->setFlash(_t('Error')); + $this->Session->setFlash(__('Error', true)); } else { - $this->Session->setFlash(_t('Your Evaluation was submitted successfully.'), 'good'); + $this->Session->setFlash(__('Your Evaluation was submitted successfully.', true), 'good'); $this->redirect('/home'); } } else { - $this->Session->setFlash(_t('Your Evaluation was submitted successfully.'), 'good'); + $this->Session->setFlash(__('Your Evaluation was submitted successfully.', true), 'good'); $this->redirect('/home'); } } else { // Supposed to go here - $this->Session->setFlash(_t('Your answers have been saved. Please answer all the required questions before it can be considered submitted.')); + $this->Session->setFlash(__('Your answers have been saved. Please answer all the required questions before it can be considered submitted.', true)); } } else { $failures = $this->User->getFullNames($failures); $failures = join(' and ', array_filter(array_merge(array(join( ', ', array_slice($failures, 0, -1))), array_slice($failures, -1)))); - $this->Session->setFlash(_t('Error: It was unsuccessful to save evaluation(s) for ').$failures); + $this->Session->setFlash(__('Error: It was unsuccessful to save evaluation(s) for ', true).$failures); } $this->redirect('/evaluations/makeEvaluation/'.$eventId.'/'.$groupId); } @@ -1156,7 +1156,7 @@ function viewEvaluationResults($eventId, $groupId = null, $displayFormat="") $eventId, User::get('id'), User::getCourseFilterPermission(), array('Course')))) { - $this->Session->setFlash(_t('Error: Invalid id or you do not have permission to access this event.')); + $this->Session->setFlash(__('Error: Invalid id or you do not have permission to access this event.', true)); $this->redirect('/home/index'); return; } @@ -1166,7 +1166,7 @@ function viewEvaluationResults($eventId, $groupId = null, $displayFormat="") if (!is_numeric($groupId) || !($group = $this->Group->getGroupWithMemberRoleByGroupIdEventId($groupId, $eventId))) { - $this->Session->setFlash(_t('Error: Invalid group id.')); + $this->Session->setFlash(__('Error: Invalid group id.', true)); $this->redirect('/home/index'); return; } @@ -1179,7 +1179,7 @@ function viewEvaluationResults($eventId, $groupId = null, $displayFormat="") $this->set('event', $event); $this->set('breadcrumb', $this->breadcrumb->push(array('course' => $event['Course'])) ->push(array('event' => $event['Event'])) - ->push(_t('Results'))); + ->push(__('Results', true))); switch ($event['Event']['event_template_type_id']) @@ -1322,7 +1322,7 @@ function studentViewEvaluationResult($eventId, $groupId = null, $studentId = nul $eventId, User::get('id'), User::getCourseFilterPermission(), array('Course')))) { - $this->Session->setFlash(_t('Error: Invalid id or you do not have permission to access this event.')); + $this->Session->setFlash(__('Error: Invalid id or you do not have permission to access this event.', true)); $this->redirect('/home/index'); return; } @@ -1333,13 +1333,13 @@ function studentViewEvaluationResult($eventId, $groupId = null, $studentId = nul //!($group = $this->Group->getGroupByGroupIdEventIdMemberId($groupId, $eventId, User::get('id')))) { !($group = $this->Group->getGroupWithMemberRoleByGroupIdEventId($groupId, $eventId))) { - $this->Session->setFlash(_t('Error: Invalid group id or you are not in this group.')); + $this->Session->setFlash(__('Error: Invalid group id or you are not in this group.', true)); $this->redirect('/home/index'); return; } if (!$event['Event']['is_result_released']) { - $this->Session->setFlash(_t('Error: The results are not released.')); + $this->Session->setFlash(__('Error: The results are not released.', true)); $this->redirect('/home/index'); return; } @@ -1352,7 +1352,7 @@ function studentViewEvaluationResult($eventId, $groupId = null, $studentId = nul $this->set('event', $event); $this->set('breadcrumb', $this->breadcrumb ->push('home_student') - ->push(_t('View My Results'))); + ->push(__('View My Results', true))); $userId = User::get('id'); @@ -1579,7 +1579,7 @@ function markCommentRelease($param = null) // Check whether the event exists or user has permission to access it if (!($event = $this->Event->getAccessibleEventById($eventId, User::get('id'), User::getCourseFilterPermission(), array()))) { - $this->Session->setFlash(_t('Error: That event does not exist or you dont have access to it')); + $this->Session->setFlash(__('Error: That event does not exist or you dont have access to it', true)); $this->redirect('index'); return; } @@ -1780,12 +1780,12 @@ function viewGroupSubmissionDetails ($eventId = null, $groupId = null) $course = $this->Course->getAccessibleCourseById($courseId, User::get('id'), User::getCourseFilterPermission()); if (!$course) { - $this->Session->setFlash(_t('Error: Course does not exist or you do not have permission to view this course.')); + $this->Session->setFlash(__('Error: Course does not exist or you do not have permission to view this course.', true)); $this->redirect('index'); return; } - $this->set('title_for_layout', _t('Submission Details')); + $this->set('title_for_layout', __('Submission Details', true)); $this->Event->id = $eventId; $event = $this->Event->read(); @@ -1846,13 +1846,13 @@ function viewSurveySummary($eventId) // Check that $eventId is valid $event = $this->Event->findById($eventId); if (null == $event) { - $this->Session->setFlash(_t('Error: Invalid event Id')); + $this->Session->setFlash(__('Error: Invalid event Id', true)); $this->redirect('index'); return; } if ($event['Course']['student_count'] < 1) { - $this->Session->setFlash(_t('Error: There are no students in the class')); + $this->Session->setFlash(__('Error: There are no students in the class', true)); $this->redirect('index'); return; } @@ -1860,7 +1860,7 @@ function viewSurveySummary($eventId) // Check that $surveyId is valid $survey = $this->Survey->findById($event['Event']['template_id']); if (null == $survey) { - $this->Session->setFlash(_t('Error: Invalid survey Id')); + $this->Session->setFlash(__('Error: Invalid survey Id', true)); $this->redirect('index'); return; } @@ -1869,7 +1869,7 @@ function viewSurveySummary($eventId) $course = $this->Course->getAccessibleCourseById( $event['Event']['course_id'], User::get('id'), User::getCourseFilterPermission(), array('Enrol')); if (!$course) { - $this->Session->setFlash(_t('Error: Course does not exist or you do not have permission to view this course.')); + $this->Session->setFlash(__('Error: Course does not exist or you do not have permission to view this course.', true)); $this->redirect('index'); return; } @@ -1884,7 +1884,7 @@ function viewSurveySummary($eventId) $this->set('breadcrumb', $this->breadcrumb->push(array('course' => $course['Course'])) ->push(array('event' => $event['Event'])) - ->push(_t('Summary'))); + ->push(__('Summary', true))); $submissions = $this->SurveyInput->findAllByEventId($eventId); // add submission status for each enroled user @@ -2034,7 +2034,7 @@ function viewSurveySummary($eventId) if (isset($evalutorToEvaluateesArray[$evaluators[$rowIndex-1]][$evaluators[$columnIndex-1]][$mode][$questionIndex])) { echo "
".$evalutorToEvaluateesArray[$evaluators[$rowIndex-1]][$evaluators[$columnIndex-1]][$mode][$questionIndex]." "._t('N/A')."".__('N/A', true)."
@@ -51,19 +51,19 @@ function fnFormatDetails (oTable, nTr) actions[i-2] = 'Allow'; } } - + var sOut = '
'; - + return sOut; } @@ -88,16 +88,16 @@ jQuery(document).ready(function() { "sPaginationType" : "full_numbers", "aoColumnDefs": [ { "bSearchable": false, "bSortable": false, "aTargets": [2, 3, 4, 5] }, - { "bSearchable": false, "bVisible": false, "bSortable":false, "aTargets": [ 0 ] } + { "bSearchable": false, "bVisible": false, "bSortable":false, "aTargets": [ 0 ] } ], "aaSorting" : [[1, 'asc']] }); - + // for changing between roles jQuery("#role").change(function() { window.location.href="/accesses/view/" + jQuery(this).val(); }); - + // event listener for action links jQuery('#table_id tbody td').live('click', function() { var nTr = jQuery(this).parents('tr')[0]; @@ -109,4 +109,4 @@ jQuery(document).ready(function() { }); }); - \ No newline at end of file + diff --git a/app/views/courses/edit.ctp b/app/views/courses/edit.ctp index 3d04319d4..cbd22c03f 100644 --- a/app/views/courses/edit.ctp +++ b/app/views/courses/edit.ctp @@ -11,7 +11,7 @@ echo $html->div('help-text', __('Course title, e.g. Technical Communication', tr function makeInstructor($i, $userId, $fullName, $html, $form) { // make instructor text box $name = "'$fullName'"; - $input = $form->label(' ') . $form->text("Instructor.$i.full_name", array('default' => $fullName, 'disabled' => true)) . + $input = $form->label(' ') . $form->text("Instructor.$i.full_name", array('default' => $fullName, 'disabled' => true)) . $html->link('X', '#', array('onclick' => "rmInstructor($i, $name, $userId); return false;")); $input .= $form->hidden("Instructor.Instructor.$i", array('value' => $userId)); $ret = $html->div('input text', $input, array('id' => "instructorsList$i")); @@ -72,9 +72,9 @@ echo $form->input( ) ); echo $form->input('Department', array( - 'label' => __($this->Vocabulary->translate('Department'), true), + 'label' => $this->Vocabulary->translate('Department'), )); -echo $html->div('help-text', __('Selecting correct assoication will allow admin to help troubleshooting.', true)); +echo $html->div('help-text', __('Selecting correct assoication will allow admin to help troubleshooting.', true)); echo $this->Form->input('homepage'); echo $html->div('help-text', __('e.g. http://mycoursehome.com', true)); @@ -148,4 +148,4 @@ function rmTutor(num, fullName, userId) { text: fullName })); } - \ No newline at end of file + diff --git a/app/views/elements/evaluations/mixeval_details.ctp b/app/views/elements/evaluations/mixeval_details.ctp index 7bd7daa9c..81c2ba7a7 100644 --- a/app/views/elements/evaluations/mixeval_details.ctp +++ b/app/views/elements/evaluations/mixeval_details.ctp @@ -1,13 +1,13 @@ '._t(' Comments/Grades Not Released Yet').''; + $addOn = ' - '.__(' Comments/Grades Not Released Yet', true).''; } else if (!$gradeReleased) { - $addOn = ' - '._t(' Grades Not Released Yet').''; + $addOn = ' - '.__(' Grades Not Released Yet', true).''; } else if (!$commentReleased && $details) { - $addOn = ' - '._t(' Comments Not Released Yet').''; + $addOn = ' - '.__(' Comments Not Released Yet', true).''; } -$header = _t($title).$addOn; +$header = $title.$addOn; echo $html->tag('h2', $header); $qnum = 1; @@ -27,10 +27,10 @@ if ($details) { echo '
    '; foreach ($ques['Submissions'] as $num => $sub) { if (in_array($type, array(1, 4)) && !$gradeReleased) { - echo '
  • '._t('Grades Not Released Yet').'
  • '; + echo '
  • '.__('Grades Not Released Yet', true).'
  • '; break; } else if (in_array($type, array(2, 3)) && !$commentReleased) { - echo '
  • '._t('Comments Not Released Yet').'
  • '; + echo '
  • '.__('Comments Not Released Yet', true).'
  • '; break; } $name = ''; @@ -43,7 +43,7 @@ if ($details) { $start = $zero_mark ? 0 : $step; $options = array_map('number_format',range($start, $multiplier, $step), array_fill(0, $scale, 2)); - $grade = '
'; continue; } $grades = Set::extract('/grade', $ques['Submissions']); diff --git a/app/views/elements/evaluations/simple_eval_form.ctp b/app/views/elements/evaluations/simple_eval_form.ctp index c3be60831..1fb155e17 100644 --- a/app/views/elements/evaluations/simple_eval_form.ctp +++ b/app/views/elements/evaluations/simple_eval_form.ctp @@ -152,11 +152,11 @@
  • -
  • (Must) ' : '(Optional)' ;?> .
  • +
  • ('.__('Required', true).') ' : '('.__('Optional', true).')' ;?> .
  • - '._t("Evaluation's release end date").'' : + '.__("Evaluation's release end date", true).'' : date('l, F j, Y g:i a', strtotime($event['Event']['release_date_end'])); ?> -
  • +
  • @@ -164,12 +164,11 @@ 1)?'s':''; - echo $day['Penalty']['days_late'].' day'.$mult.' late: '.$day['Penalty']['percent_penalty'].'% deduction.
    '; + echo sprintf(__('%d day(s) late: %s deduction.', true), $day['Penalty']['days_late'], $day['Penalty']['percent_penalty'].'%').'
    '; } - echo $penaltyFinal['Penalty']['percent_penalty'].'% is deducted afterwards.'; + echo sprintf(__('%s is deducted afterwards.', true), $penaltyFinal['Penalty']['percent_penalty'].'%'); } else { - echo 'No penalty is specified for this evaluation.'; + echo __('No penalty is specified for this evaluation.', true); } ?> diff --git a/app/views/elements/mixevals/questions_editor.ctp b/app/views/elements/mixevals/questions_editor.ctp index bf6afd4d9..8c18a89a8 100644 --- a/app/views/elements/mixevals/questions_editor.ctp +++ b/app/views/elements/mixevals/questions_editor.ctp @@ -1,7 +1,7 @@ link('x', '#', + $removeLink = $html->link('x', '#', array( - 'class' => 'removeQ', + 'class' => 'removeQ', 'onclick' => "removeQ($i, $selfEval); return false;", 'escape' => false ) ); - $upLink = $html->link('â–²', '#', + $upLink = $html->link('â–²', '#', array( - 'class' => 'upQ', + 'class' => 'upQ', 'onclick' => "upQ($i, $selfEval); return false;", 'escape' => false ) ); - $downLink = $html->link('â–¼', '#', + $downLink = $html->link('â–¼', '#', array( - 'class' => 'downQ', + 'class' => 'downQ', 'onclick' => "downQ($i, $selfEval); return false;", 'escape' => false ) @@ -76,11 +76,11 @@ function makeQ($view, $qType, $i, $qTypes, $selfEval, $quesNum, $required=true) // give an ID to the question number for easy renumbering later on $qNum = $html->tag('span', $quesNum . ". ", array('id' => "questionIndex$i")); $requiredTxt = ($qType != 'Likert') ? '' : - $html->div("help-text", _t('Unrequired Likert questions are not counted toward the total rating.')); + $html->div("help-text", __('Unrequired Likert questions are not counted toward the total rating.', true)); $ret = $html->div('MixevalMakeQuestion', $html->tag('h3', "$controls $qNum $qHeader") . $hiddenIdField . - $form->input("MixevalQuestion.$i.title", + $form->input("MixevalQuestion.$i.title", array("type" => "text", "label" => "Question")) . $form->input("MixevalQuestion.$i.instructions") . $form->input("MixevalQuestion.$i.required", array('checked' => $required)) . @@ -88,7 +88,7 @@ function makeQ($view, $qType, $i, $qTypes, $selfEval, $quesNum, $required=true) $requiredTxt . $form->hidden("MixevalQuestion.$i.mixeval_question_type_id", array('value' => $qTypeId)) . - $form->hidden("MixevalQuestion.$i.question_num", + $form->hidden("MixevalQuestion.$i.question_num", array('value' => $i + 1)) . $qFields , @@ -104,8 +104,8 @@ function scoredropdownFields($view, $i) { $form = $view->Form; $ret = $form->hidden("MixevalQuestion.$i.multiplier", array('value' => 10)); - $ret = $ret.$html->div("help-text", - _t('The increments on the drop-down will be based on 10 base points per member, the drop-down will go from 1 to (10 x No. of GroupMembers) in increments of 1
    ')); + $ret = $ret.$html->div("help-text", + __('The increments on the drop-down will be based on 10 base points per member, the drop-down will go from 1 to (10 x No. of GroupMembers) in increments of 1
    ', true)); return $ret; } @@ -125,17 +125,17 @@ function likertFields($view, $i) { } } - $ret = $form->input("MixevalQuestion.$i.multiplier", + $ret = $form->input("MixevalQuestion.$i.multiplier", array('label' => 'Marks')); - $ret .= $html->div("help-text", - _t('This mark will be scaled according to the response. E.g.: If there are 5 scale levels and this is set at 1, the lowest scale will be worth 0.2 marks, the second lowest 0.4 marks, and so on with the highest scale being worth the full 1 mark.')); + $ret .= $html->div("help-text", + __('This mark will be scaled according to the response. E.g.: If there are 5 scale levels and this is set at 1, the lowest scale will be worth 0.2 marks, the second lowest 0.4 marks, and so on with the highest scale being worth the full 1 mark.', true)); $ret .= $form->input("MixevalQuestion.$i.show_marks", array('label' => 'Show Marks', 'type' => 'checkbox')); $ret .= $html->div("help-text", - _t('This setting will hide/show the mark distribution to those taking the evaluation.')); + __('This setting will hide/show the mark distribution to those taking the evaluation.', true)); $ret .= $html->div('', $form->label(null, 'Scale', array('class' => 'defLabel')) . - $form->button("Add", array('type' => 'button', + $form->button("Add", array('type' => 'button', 'onclick' => "addDesc($i);")) . $html->div('DescsDiv', $descs, array('id' => "DescsDiv$i")) ); @@ -155,13 +155,13 @@ function makeDesc($view, $qNum, $descNum) { } $ret = $html->div('MixevalQuestionDesc', - $hiddenIdField . + $hiddenIdField . $form->text("MixevalQuestionDesc.$descNum.descriptor") . - $form->hidden("MixevalQuestionDesc.$descNum.question_index", + $form->hidden("MixevalQuestionDesc.$descNum.question_index", array('value' => $qNum, 'class' => "MixevalQuestionDesc$qNum")) . - $html->link('x', '#', + $html->link('x', '#', array( - 'class' => 'removeQ', + 'class' => 'removeQ', 'onclick' => "removeDesc($qNum, $descNum); return false;" ) ), @@ -170,10 +170,10 @@ function makeDesc($view, $qNum, $descNum) { return $ret; } -/* Now that we have all the question templates, we need to check whether the - * user is visiting this page from a failed submit. If the user is visiting - * from a failed submit, we need to reload all the questions they've already - * configured, so they don't have to enter them all over again. +/* Now that we have all the question templates, we need to check whether the + * user is visiting this page from a failed submit. If the user is visiting + * from a failed submit, we need to reload all the questions they've already + * configured, so they don't have to enter them all over again. */ $numQ = 0; // for initializing the javascript counter that track question $numPeer = 1; // for initializing the question number for peer evaluation questions @@ -223,7 +223,7 @@ echo $html->div('', $reloadedQ, array('id' => 'questions', 'class' => 'questions // self evaluation questions section echo '
    '; echo $html->tag('h3', __('Self-Evaluation Questions', true)); -$addQButton = $form->button(__('Add', true), +$addQButton = $form->button(__('Add', true), array('type' => 'button', 'onclick' => "insertQ(true);")); $selfQTypes = $qTypes; unset($selfQTypes[4]); // remove score dropdown from self-evaluation @@ -239,7 +239,7 @@ var numQ = ; // the total number of questions var numPeer = ; // next question number for peer evaluation ques var numSelf = ; // next question number for self evaluation ques // the total number of descriptors -var numDesc = ; +var numDesc = ; // keeps track of currently valid user ids, cause users can remove questions var questionIds = []; var peerQuesIds = []; // for peer evaluation section @@ -383,7 +383,7 @@ function reorderQ() { } } -// Add a question descriptor, this is used to configure things like scale +// Add a question descriptor, this is used to configure things like scale // levels in likert questions function addDesc(numQ) { var insert = desc.replace(/-1/g, numQ); diff --git a/app/views/elements/users/merge_search.ctp b/app/views/elements/users/merge_search.ctp index 23f193c87..0615f12c4 100644 --- a/app/views/elements/users/merge_search.ctp +++ b/app/views/elements/users/merge_search.ctp @@ -2,14 +2,14 @@ $Account = ucwords($account); ?>
    -

    - Form->input('User.'.$account.'Search', +

    + Form->input('User.'.$account.'Search', array('label' => false, 'options' => $searchValue, 'class' => 'search', 'div' => false)); ?> - Form->input('User.'.$account.'SearchValue', + Form->input('User.'.$account.'SearchValue', array('label' => false, 'class' => 'searchValue', 'div' => false)); ?> Form->input('User.'.$account.'Account', - array('label' => __('User', true), 'empty' => __('-- Search for the '.$account.' account --', true), 'class' => 'account')); ?> - + array('label' => __('User', true), 'empty' => sprintf(__('-- Search for the %s account --', true), $account), 'class' => 'account')); ?> +
    @@ -28,4 +28,4 @@
    - \ No newline at end of file + diff --git a/app/views/evaluations/mixeval_eval_form.ctp b/app/views/evaluations/mixeval_eval_form.ctp index f69a07ba0..0da43d500 100644 --- a/app/views/evaluations/mixeval_eval_form.ctp +++ b/app/views/evaluations/mixeval_eval_form.ctp @@ -1,19 +1,19 @@

    -

    -
    +

    +
    -

    +

      -
    • -
    • +
    • +
    • -
    • -
    • tag('span', '*', array('class' => 'required orangered'))._t(' marks required questions.')?>
    • +
    • +
    • tag('span', '*', array('class' => 'required orangered')).__(' marks required questions.', true)?>
    • - +
    • @@ -40,9 +40,9 @@ "; ?> "; ?> - + 0 ) { foreach($groupMembers as $row): $user = $row['User']; ?>

      @@ -58,7 +58,7 @@ ); echo $this->element('mixevals/view_mixeval_details', $params); ?>
      - 0 && $enrol > 0) { ?>

      @@ -88,7 +88,7 @@ - @@ -120,7 +120,7 @@ jQuery("#submit").click(function() { alert('Please fill in all required questions before resubmitting the evaluation.'); return false; } - + }); function validate() { @@ -149,4 +149,4 @@ function validate() { -
    \ No newline at end of file + diff --git a/app/views/evaluations/rubric_eval_form.ctp b/app/views/evaluations/rubric_eval_form.ctp index d7a40e990..fab5fec42 100644 --- a/app/views/evaluations/rubric_eval_form.ctp +++ b/app/views/evaluations/rubric_eval_form.ctp @@ -4,7 +4,7 @@ var numUsers = ; function saveButtonVal(userId, viewMode) { var complete = true; - + if(viewMode == 0){ for (var i=1; i <= numQues; i++) { var value = jQuery('input[name='+userId+'criteria_points_'+i+']:checked').val(); @@ -87,7 +87,7 @@ function saveButtonVal(userId, viewMode) {
  • NOTE: You can click the "Submit to Complete the Evaluation" button only AFTER all evaluations are completed.')?>
  • -
  • +
  • diff --git a/app/views/evaluations/student_view_rubric_evaluation_results.ctp b/app/views/evaluations/student_view_rubric_evaluation_results.ctp index 61ee92a68..d1039f982 100644 --- a/app/views/evaluations/student_view_rubric_evaluation_results.ctp +++ b/app/views/evaluations/student_view_rubric_evaluation_results.ctp @@ -99,8 +99,8 @@ } echo "
    "; echo ""; - echo ""; - echo ""; + echo ""; + echo ""; echo ""; foreach ($rubric['RubricsCriteria'] as $ques) { echo ""; diff --git a/app/views/evaluations/survey_eval_form.ctp b/app/views/evaluations/survey_eval_form.ctp index 6980f611e..2161a0f11 100644 --- a/app/views/evaluations/survey_eval_form.ctp +++ b/app/views/evaluations/survey_eval_form.ctp @@ -1,12 +1,12 @@
    -

    -
    +

    +
    ' . $event['Event']['title'] . ''; if (empty($studentId)) { - echo $form->create('SurveyInput', + echo $form->create('SurveyInput', array('url' => "makeEvaluation/$eventId")); } else { @@ -21,7 +21,7 @@ foreach ($questions as $i => $q) { "$i.response_id", array( 'type' => 'radio', - 'options' => $q['ResponseOptions'], + 'options' => $q['ResponseOptions'], 'separator' => '
    ', 'legend' => false ) @@ -30,7 +30,7 @@ foreach ($questions as $i => $q) { echo $form->input( "$i.response_id", array( - 'options' => $q['ResponseOptions'], + 'options' => $q['ResponseOptions'], 'multiple' => 'checkbox', 'label' => false ) diff --git a/app/views/events/add.ctp b/app/views/events/add.ctp index e80e2e026..be1db6912 100644 --- a/app/views/events/add.ctp +++ b/app/views/events/add.ctp @@ -53,7 +53,7 @@ echo $this->Form->input( 'default' => '1' ) ); ?> -
    +
    Form->input('due_date', array('type' => 'text')); echo $this->Form->input('release_date_begin', array('label' => 'Evaluation Released From', 'type' => 'text')); @@ -62,7 +62,7 @@ echo $this->Form->input('result_release_date_begin', array('div' => array('id' => 'ResultReleaseBeginDiv'), 'label' => 'Results Released From', 'type' => 'text')); echo $this->Form->input('result_release_date_end', array('div' => array('id' => 'ResultReleaseEndDiv'), 'label' => 'Until', 'type' => 'text')); - + echo $this->Form->input( 'email_schedule', array( @@ -70,7 +70,7 @@ echo $this->Form->input( 'options' => $emailSchedules, 'div' => array('id' => 'emailSchedule') ) -); +); ?> diff --git a/app/views/events/edit.ctp b/app/views/events/edit.ctp index c6d03d83c..8d032a79e 100644 --- a/app/views/events/edit.ctp +++ b/app/views/events/edit.ctp @@ -84,7 +84,7 @@ echo $this->Form->input( 'default' => '1' ) ); ?> -
    +
    Form->input('due_date', array('type' => 'text')); echo $this->Form->input('release_date_begin', array('label' => 'Evaluation Released From', 'type' => 'text')); @@ -102,7 +102,7 @@ echo $this->Form->input( 'default' => "$email_schedule", 'div' => array('id' => 'emailSchedule') ) -); +); ?> diff --git a/app/views/faculties/view.ctp b/app/views/faculties/view.ctp index dc8def440..22966c02b 100644 --- a/app/views/faculties/view.ctp +++ b/app/views/faculties/view.ctp @@ -1,6 +1,6 @@

    -

    Vocabulary->translate('Department'));?>

    +

    Vocabulary->translate('Department');?>

    "._t('Criteria').""._t('Grade')."".__('Criteria', true)."".__('Grade', true)."
    diff --git a/app/views/groups/import.ctp b/app/views/groups/import.ctp index 68a71c83d..c2434d27b 100644 --- a/app/views/groups/import.ctp +++ b/app/views/groups/import.ctp @@ -20,7 +20,7 @@ 29978043,
    29978051, - +

    Form->input('identifiers', array( 'legend' => __('Student Identifier', true), 'default' => 'username' )); -?>
    Form->input('Course', array('multiple'=>false, 'default' => $courseId)); echo $this->Form->input('update_groups', array('type'=>'checkbox'));; -?>
    Form->submit(__('Import', true)); echo $this->Form->end(); ?> - \ No newline at end of file + diff --git a/app/views/groups/import_results.ctp b/app/views/groups/import_results.ctp index 555767d5f..1c27efe10 100644 --- a/app/views/groups/import_results.ctp +++ b/app/views/groups/import_results.ctp @@ -1,39 +1,39 @@

    -

    '";>
    '._t('Invalid Entries').''; - echo '
    • '._t('There are more or less than 2 columns.').'
    '; - echo '
    '; + echo '

    '.__('Invalid Entries', true).'

    '; + echo '
    • '.__('There are more or less than 2 columns.', true).'
    '; + echo '
    '._t('Entry').'
    '; foreach ($invalid as $entry) { echo ''; } echo '
    '.__('Entry', true).'
    '.implode(', ', $entry).' ('.count($entry).' columns)
    '; } if (!empty($groupSuccess)) { - echo '

    '._t('Groups Created').'

    '; - echo ''; + echo '

    '.__('Groups Created', true).'

    '; + echo '
    '._t('Name').'
    '; foreach ($groupSuccess as $group) { echo ''; } echo '
    '.__('Name', true).'
    '.$group.'
    '; } if (!empty($groupFailure)) { - echo '

    '._t('Groups that could not be created.').'

    '; - echo ''; + echo '

    '.__('Groups that could not be created.', true).'

    '; + echo '
    '._t('Name').'
    '; foreach ($groupFailure as $group) { echo ''; } echo '
    '.__('Name', true).'
    '.$group.'
    '; } if (!empty($memSuccess)) { - echo '

    '._t('Students Placed').'

    '; - echo ''; - echo ''; + echo '

    '.__('Students Placed', true).'

    '; + echo '
    '._t('Student').''._t('Group').'
    '; + echo ''; foreach ($memSuccess as $groupName => $group) { foreach ($group as $member) { echo ''; @@ -43,15 +43,15 @@ if (!empty($memSuccess)) { echo '
    '.__('Student', true).''.__('Group', true).'
    '.$member.'
    '; } if (!empty($memFailure)) { - echo '

    '._t('Students Not Placed').'

    '; - echo '

    '._t('Possible Reasons:').'

    '; + echo '

    '.__('Students Not Placed', true).'

    '; + echo '

    '.__('Possible Reasons:', true).'

    '; echo '
      '; - echo '
    • '._t('The student identifier does not exist in the system. Please add them first.').'
    • '; - echo '
    • '._t('The student is not enrolled in the course. Please enrol them first.').'
    • '; - echo '
    • '._t('The group was unable to be created or does not exist.').'
    • '; + echo '
    • '.__('The student identifier does not exist in the system. Please add them first.', true).'
    • '; + echo '
    • '.__('The student is not enrolled in the course. Please enrol them first.', true).'
    • '; + echo '
    • '.__('The group was unable to be created or does not exist.', true).'
    • '; echo '
    '; - echo ''; - echo ''; + echo '
    '._t('Student').''._t('Group').'
    '; + echo ''; foreach ($memFailure as $groupName => $group) { foreach ($group as $member) { echo ''; @@ -61,4 +61,4 @@ if (!empty($memFailure)) { echo '
    '.__('Student', true).''.__('Group', true).'
    '.$member.'
    '; } ?> - \ No newline at end of file + diff --git a/app/views/mixevals/view.ctp b/app/views/mixevals/view.ctp index 1a8b2526d..00009094e 100644 --- a/app/views/mixevals/view.ctp +++ b/app/views/mixevals/view.ctp @@ -37,7 +37,7 @@ $totalMarks = $mixeval['total_marks']; $id = array('id' => 0); $event = array('Event' => $id, 'GroupEvent' => $id, 'Group' => $id); - + $params = array('controller' => 'mixevals', 'zero_mark' => $mixeval['zero_mark'], 'questions' => $questions, @@ -64,8 +64,8 @@ if ($mixeval['self_eval'] > 0) { } $required = $html->tag('span', '*', array('class' => 'required orangered')); -echo $html->para('note', $required . ' ' . _t('Indicates response required.')); -echo $html->para('marks', _t('Total Marks') . ": $totalMarks"); +echo $html->para('note', $required . ' ' . __('Indicates response required.', true)); +echo $html->para('marks', __('Total Marks', true) . ": $totalMarks"); ?> diff --git a/app/views/pages/admin.ctp b/app/views/pages/admin.ctp index cc3ee97d7..c96551822 100644 --- a/app/views/pages/admin.ctp +++ b/app/views/pages/admin.ctp @@ -18,7 +18,7 @@ if (User::hasPermission('controllers/faculties')) { if (User::hasPermission('controllers/departments')) { echo '
  • '; echo $this->Html->link( - __(Inflector::pluralize($this->Vocabulary->translate('Department')), true), + Inflector::pluralize($this->Vocabulary->translate('Department')), array('controller' => 'departments') ); echo '
  • '; diff --git a/build.xml b/build.xml index e4a2eafee..f4530198b 100644 --- a/build.xml +++ b/build.xml @@ -296,4 +296,9 @@ + + + + + From dbddb97c806bb4dbef080dcba0152c0f71183163 Mon Sep 17 00:00:00 2001 From: Compass Date: Thu, 20 Feb 2014 23:24:07 -0800 Subject: [PATCH 41/91] Fix a few failed tests --- app/tests/cases/system/add_course.test.php | 2 +- app/tests/cases/system/add_event.test.php | 107 ++++++------- app/tests/cases/system/add_rubric.test.php | 96 +++++------ .../cases/system/student_simple.test.php | 150 +++++++++--------- app/vendors/simpletest/test/eclipse_test.php | 18 +-- 5 files changed, 187 insertions(+), 186 deletions(-) diff --git a/app/tests/cases/system/add_course.test.php b/app/tests/cases/system/add_course.test.php index 3b0ab3f23..d9e6c75fc 100644 --- a/app/tests/cases/system/add_course.test.php +++ b/app/tests/cases/system/add_course.test.php @@ -240,7 +240,7 @@ public function testCourseHomeLinks() $this->assertEqual($groups, '2 groups'); $events = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, ".//*[@id='CourseHome']/table/tbody/tr[2]/td[6]")->text(); - $this->assertEqual($events, '10 events'); + $this->assertEqual($events, '17 events'); } public function testStudentLinks() diff --git a/app/tests/cases/system/add_event.test.php b/app/tests/cases/system/add_event.test.php index 28aa26fbf..0c2062ec2 100644 --- a/app/tests/cases/system/add_event.test.php +++ b/app/tests/cases/system/add_event.test.php @@ -2,7 +2,7 @@ require_once('system_base.php'); class addEventTestCase extends SystemBaseTestCase -{ +{ public function startCase() { $this->getUrl(); @@ -11,19 +11,19 @@ public function startCase() $this->web_driver = new SystemWebDriver($wd_host); $this->session = $this->web_driver->session('firefox'); $this->session->open($this->url); - + $w = new PHPWebDriver_WebDriverWait($this->session); $this->session->deleteAllCookies(); $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('instructor1', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testAddEvent() { $this->session->open($this->url.'events/add/1'); @@ -34,7 +34,7 @@ public function testAddEvent() $eventId = end(explode('/', $this->session->url())); $this->session->open($this->url.'events/edit/'.$eventId); $this->eventsEdit(); - + // search that all the email schedules have been created $this->session->open($this->url.'emailer'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'searchInputField')->sendKeys('mech'); @@ -60,9 +60,9 @@ function($session) { } ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); - $this->assertEqual($msg, 'The Email was canceled successfully.'); + $this->assertEqual($msg, 'The Email was canceled successfully.'); } - + // delete the event $this->session->open($this->url.'events/delete/'.$eventId); $w->until( @@ -73,13 +73,13 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The event has been deleted successfully.'); } - + public function eventsFormError() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')->text(); $this->assertEqual($msg, 'Add event failed.'); - + $validate = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CLASS_NAME, 'error-message'); $this->assertEqual($validate[0]->text(), 'Title is required.'); $this->assertEqual($validate[1]->text(), 'Must be in Year-Month-Day Hour:Minute:Second format.'); @@ -87,24 +87,25 @@ public function eventsFormError() $this->assertEqual($validate[3]->text(), 'Must be in Year-Month-Day Hour:Minute:Second format.'); $this->assertEqual($validate[4]->text(), 'Must be in Year-Month-Day Hour:Minute:Second format.'); $this->assertEqual($validate[5]->text(), 'Must be in Year-Month-Day Hour:Minute:Second format.'); - + $courseId = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventCourseId"] option'); $this->assertEqual($courseId[0]->attribute('value'), 1); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventTitle')->sendKeys('simple evaluation 2'); - $w = new PHPWebDriver_WebDriverWait($this->session); + // duplicate event title is allowed now + /*$w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { $warning = $session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'titleWarning')->text(); return ($warning == 'Event title "simple evaluation 2" already exists in this course.'); } - ); + );*/ $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventTitle')->clear(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEventTemplateTypeId"] option[value="3"]')->click(); $preview = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'prevV')->attribute('href');; $this->assertTrue(strpos($preview, 'surveys/view/1')); - + // check dates toggle $date = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDueDate'); $this->assertTrue(!empty($date)); @@ -116,7 +117,7 @@ function($session) { $this->assertTrue(empty($date)); $date = $this->session->elements(PHPWebDriver_WebDriverBy::ID, 'ResultReleaseDateEndDiv'); $this->assertTrue(empty($date)); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEventTemplateTypeId"] option[value="2"]')->click(); // check boolean options $boolean = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[checked="checked"]'); @@ -136,7 +137,7 @@ function($session) { $this->assertTrue(!empty($date)); $date = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'ResultReleaseEndDiv'); $this->assertTrue(!empty($date)); - + // penalty $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Penalty')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Penalty')->click(); @@ -149,7 +150,7 @@ function($session) { $this->assertEqual($dayThree, 3); $percent = count($this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="Penalty1PercentPenalty"] option')); $this->assertEqual($percent, 100); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[onclick="rmPenaltyInputs(0); return false;"]')->click(); $penalties = count($this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="penaltyInputs"] div[class="penaltyInput"]')); $this->assertEqual($penalties, 2); @@ -161,17 +162,17 @@ function($session) { $dayFive = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'Penalty4DaysLate')->attribute('value'); $this->assertEqual($dayFive, 5); } - + public function fillInEventAddForm() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventTitle')->sendKeys('Final Project Peer Evaluation'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDescription')->sendKeys('Peer evaluation for the final project'); - + // set email reminder frequency to 2 days $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEmailSchedule"] option[value="2"]')->click(); // select all groups $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[id="selectAll"]')->click(); - + // fill in the dates $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDueDate')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[title="Next"]')->click(); @@ -188,7 +189,7 @@ public function fillInEventAddForm() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateEnd')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[title="Next"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, '28')->click(); - + // submit form $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); @@ -198,14 +199,14 @@ function($session) { } ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); - $this->assertEqual($msg, 'Add event successful!'); + $this->assertEqual($msg, 'Add event successful!'); } - + public function eventsEdit() { $courseId = $this->session->elements(PHPWebDriver_WebDriverBy::ID, 'EventCourseId'); $this->assertTrue(empty($courseId)); - + // test that email frequency is 2 days $email = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEmailSchedule"] option[selected="selected"]'); $this->assertEqual($email->attribute('value'), 2); @@ -213,7 +214,7 @@ public function eventsEdit() $eventId = end(explode('/', $this->session->url())); $groups = count($this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="GroupGroup"] option[selected="selected"]')); $this->assertEqual($groups, 2); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'unselectAll')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); @@ -225,7 +226,7 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Edit event successful!'); - + $this->session->open($this->url.'events/edit/'.$eventId); $groups = count($this->session->elements(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="GroupGroup"] option[selected="selected"]')); $this->assertEqual($groups, 0); @@ -237,7 +238,7 @@ public function testEmailRemindersForEvals() $this->session->open($this->url.'events/add/1'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventTitle')->sendKeys('Simple Evaluation with Reminders'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDescription')->sendKeys('w/ reminders'); - + // fill in the dates $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDueDate')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[title="Next"]')->click(); @@ -252,15 +253,15 @@ public function testEmailRemindersForEvals() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateEnd')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[title="Next"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, '28')->click(); - + $dueDate = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDueDate')->attribute('value'); $releaseEnd = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventReleaseDateEnd')->attribute('value'); - + // set email reminder frequency to 5 days $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEmailSchedule"] option[value="5"]')->click(); // select all groups $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[id="selectAll"]')->click(); - + // submit form $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); @@ -271,10 +272,10 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Add event successful!'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation with Reminders')->click(); $eventId = end(explode('/', $this->session->url())); - + // Alex Student completes the evaluations $this->waitForLogoutLogin('redshirt0002'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation with Reminders')->click(); @@ -290,7 +291,7 @@ function($session) { $this->removeFromGroup(); // send emails exec('cd '.dirname(__FILE__).'/../../../ && ../cake/console/cake send_emails'); - + // check recipients list $this->session->open($this->url.'emailer'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'MECH 328 - iPeer Evaluation Reminder')->click(); @@ -331,19 +332,19 @@ function($session) { $scheduled++; //includes the one that was sent and can't be deleted; test that all unsent emails are deleted $this->assertEqual(count($emails), $scheduled); - + // delete unsent emails - by disabling email reminders $this->session->open($this->url.'events/edit/'.$eventId); $frequency = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEmailSchedule"] option[selected="selected"]'); $this->assertEqual($frequency->attribute('value'), 4); // the frequency was updated - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEmailSchedule"] option')->click(); + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEmailSchedule"] option')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $this->session->open($this->url.'emailer'); $emails = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'MECH 328 - iPeer Evaluation Reminder'); $this->assertEqual(count($emails), 1); @@ -357,7 +358,7 @@ function($session) { ); $message = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage'); $this->assertEqual($message->text(), 'Cannot cancel: Email is already sent.'); - + $this->session->open($this->url.'events/delete/'.$eventId); $w->until( function($session) { @@ -373,7 +374,7 @@ public function testEmailRemindersForSurveys() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventTitle')->sendKeys('Survey with Email Reminders'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDescription')->sendKeys('Email Reminders are included'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEventTemplateTypeId"] option[value="3"]')->click(); - + // fill in the dates $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDueDate')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[title="Next"]')->click(); @@ -382,7 +383,7 @@ public function testEmailRemindersForSurveys() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventReleaseDateEnd')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[title="Next"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, '13')->click(); - + // set email reminder frequency to 5 days $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEmailSchedule"] option[value="5"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); @@ -396,7 +397,7 @@ function($session) { $this->assertEqual($msg, 'Add event successful!'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Survey with Email Reminders')->click(); $eventId = end(explode('/', $this->session->url())); - + // Alex Student completes the survey $this->waitForLogoutLogin('redshirt0002'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Survey with Email Reminders')->click(); @@ -410,20 +411,20 @@ function($session) { ); // send emails exec('cd '.dirname(__FILE__).'/../../../ && ../cake/console/cake send_emails'); // send emails - - // check recipients list + + // check recipients list $this->waitForLogoutLogin('root'); $this->session->open($this->url.'emailer'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'MECH 328 - iPeer Survey Reminder')->click(); $alex = $this->session->elements(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Alex Student'); $this->assertTrue(empty($alex)); // Alex is not listed because he has submitted already - + // frequency calculations $this->session->open($this->url.'events/edit/'.$eventId); $frequency = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEmailSchedule"] option[selected="selected"]'); $this->assertEqual($frequency->attribute('value'), 5); - + // update frequency $dueDate = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDueDate')->attribute('value'); $scheduled = ceil((strtotime($dueDate) - time()) / (60*60*24*4)); // number of emails scheduled @@ -446,14 +447,14 @@ function($session) { $this->session->open($this->url.'events/edit/'.$eventId); $frequency = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEmailSchedule"] option[selected="selected"]'); $this->assertEqual($frequency->attribute('value'), 4); // the frequency was updated - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEmailSchedule"] option')->click(); + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEmailSchedule"] option')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $this->session->open($this->url.'emailer'); $emails = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'MECH 328 - iPeer Survey Reminder'); $this->assertEqual(count($emails), 1); @@ -467,7 +468,7 @@ function($session) { ); $message = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage'); $this->assertEqual($message->text(), 'Cannot cancel: Email is already sent.'); - + $this->session->open($this->url.'events/delete/'.$eventId); $w->until( function($session) { @@ -475,7 +476,7 @@ function($session) { } ); } - + public function testCornerCasesForFrequencies() { // one reminder - interval too big - shows up as 7 days @@ -483,7 +484,7 @@ public function testCornerCasesForFrequencies() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventTitle')->sendKeys('Survey with Email Reminders'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDescription')->sendKeys('Email Reminders are included'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEventTemplateTypeId"] option[value="3"]')->click(); - + // fill in the dates - interval is 2 days $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDueDate')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[title="Next"]')->click(); @@ -503,7 +504,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Survey with Email Reminders')->click(); $eventId = end(explode('/', $this->session->url())); $this->session->open($this->url.'events/edit/'.$eventId); @@ -517,7 +518,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $this->session->open($this->url.'events/delete/'.$eventId); $w->until( function($session) { @@ -555,4 +556,4 @@ function($session) { } ); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/add_rubric.test.php b/app/tests/cases/system/add_rubric.test.php index c54163f0d..20dff3435 100644 --- a/app/tests/cases/system/add_rubric.test.php +++ b/app/tests/cases/system/add_rubric.test.php @@ -4,7 +4,7 @@ class addRubricTestCase extends SystemBaseTestCase { protected $rubricId = 0; - + public function startCase() { $this->getUrl(); @@ -13,19 +13,19 @@ public function startCase() $this->web_driver = new SystemWebDriver($wd_host); $this->session = $this->web_driver->session('firefox'); $this->session->open($this->url); - + $w = new PHPWebDriver_WebDriverWait($this->session); $this->session->deleteAllCookies(); $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testAddRubricErrors() { $this->session->open($this->url.'rubrics/add'); @@ -35,14 +35,13 @@ public function testAddRubricErrors() $this->assertEqual($flash, 'The evaluation was not added successfully.'); $errors = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CLASS_NAME, 'error-message'); $this->assertEqual($errors[0]->text(), 'Please give the evaluation template a name.'); - $this->assertEqual($errors[1]->text(), 'Please select an availability option.'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'name')->sendKeys('Term Report Evaluation'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Save"]')->click(); $error = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CLASS_NAME, 'error-message'); $this->assertEqual($error->text(), 'Duplicate name found. Please change the name.'); } - + public function testAddRubricStepOne() { $this->session->open($this->url.'rubrics'); @@ -54,16 +53,16 @@ public function testAddRubricStepOne() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'zero_mark')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); } - + public function testAddRubricStepTwo() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsLom0LomComment')->sendKeys('Bad'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsLom1LomComment')->sendKeys('Average'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsLom2LomComment')->sendKeys('Good'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria0Criteria')->sendKeys('Effort'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria1Criteria')->sendKeys('Participation'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria0RubricsCriteriaComment0CriteriaComment')->sendKeys('Does a sloppy job.'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, @@ -82,24 +81,24 @@ public function testAddRubricStepTwo() 'select[id="RubricsCriteria0Multiplier"] option[value="4"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="RubricsCriteria1Multiplier"] option[value="3"]')->click(); - + $crit1mk1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark00')->attribute("value"); $this->assertEqual($crit1mk1, 0); $crit1mk2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark01')->attribute("value"); $this->assertEqual($crit1mk2, 2); $crit1mk3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark02')->attribute("value"); $this->assertEqual($crit1mk3, 4); - + $crit2mk1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark10')->attribute("value"); $this->assertEqual($crit2mk1, 0); $crit2mk2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark11')->attribute("value"); $this->assertEqual($crit2mk2, 1.5); $crit2mk3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark12')->attribute("value"); $this->assertEqual($crit2mk3, 3); - + $total = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'total')->attribute("value"); - $this->assertEqual($total, 7); - + $this->assertEqual($total, 7); + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit-rubric')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -110,21 +109,22 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The rubric was added successfully.'); } - + public function testRubricEdit() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Midterm Evaluation')->click(); $url = $this->session->url(); $this->rubricId = end(explode('/', $url)); $this->session->open(str_replace('view', 'edit', $url)); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'name')->clear(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'name')->sendKeys('Final Project Evaluation'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'AvailabilityPublic')->click(); + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'ViewModeCriteria')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="LOM"] option[value="4"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="criteria"] option[value="3"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, 'preview')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsLom3LomComment')->sendKeys('Excellent'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria0RubricsCriteriaComment3CriteriaComment')->sendKeys('Willing to help others as well'); @@ -140,14 +140,14 @@ public function testRubricEdit() 'RubricsCriteria2RubricsCriteriaComment2CriteriaComment')->sendKeys('On time all of the time'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria2RubricsCriteriaComment3CriteriaComment')->sendKeys('Always early'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="RubricsCriteria0Multiplier"] option[value="5"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="RubricsCriteria1Multiplier"] option[value="4"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="RubricsCriteria2Multiplier"] option[value="7"]')->click(); - + $crit1mk1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark00')->attribute("value"); $this->assertEqual($crit1mk1, 0); $crit1mk2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark01')->attribute("value"); @@ -156,7 +156,7 @@ public function testRubricEdit() $this->assertEqual($crit1mk3, 3.33); $crit1mk4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark03')->attribute("value"); $this->assertEqual($crit1mk4, 5); - + $crit2mk1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark10')->attribute("value"); $this->assertEqual($crit2mk1, 0); $crit2mk2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark11')->attribute("value"); @@ -165,7 +165,7 @@ public function testRubricEdit() $this->assertEqual($crit2mk3, 2.67); $crit2mk4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark13')->attribute("value"); $this->assertEqual($crit2mk4, 4); - + $crit3mk1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark20')->attribute("value"); $this->assertEqual($crit3mk1, 0); $crit3mk2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark21')->attribute("value"); @@ -174,10 +174,10 @@ public function testRubricEdit() $this->assertEqual($crit3mk3, 4.67); $crit3mk4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark23')->attribute("value"); $this->assertEqual($crit3mk4, 7); - + $total = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'total')->attribute("value"); $this->assertEqual($total, 16); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit-rubric')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -188,7 +188,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The rubric evaluation was updated successfully'); } - + public function testRubricAccess() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Term Report Evaluation')->click(); @@ -199,11 +199,11 @@ public function testRubricAccess() $this->session->open(str_replace('view', 'edit', $url)); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')->text(); $this->assertEqual($msg, 'Submissions had been made. Term Report Evaluation cannot be edited. Please make a copy.'); - + $this->session->open($this->url.'evaltools'); $eval = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Final Project Evaluation'); $this->assertTrue(!empty($eval)); - + $this->waitForLogoutLogin('instructor1'); $this->session->open($this->url.'rubrics/index'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Final Project Evaluation')->click(); @@ -219,7 +219,7 @@ public function testRubricAccess() $this->assertTrue(empty($eval)); $this->session->open(str_replace('view', 'copy', $url)); } - + public function testCopyRubric() { $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'name')->attribute('value'); @@ -232,7 +232,7 @@ public function testCopyRubric() $this->assertTrue($avail->attribute('checked')); $zero = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'zero_mark'); $this->assertTrue($zero->attribute('checked')); - + $lom1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsLom0LomComment')->text(); $this->assertEqual($lom1, 'Bad'); $lom2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsLom1LomComment')->text(); @@ -241,15 +241,15 @@ public function testCopyRubric() $this->assertEqual($lom3, 'Good'); $lom4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsLom3LomComment')->text(); $this->assertEqual($lom4, 'Excellent'); - + $crit1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria0Criteria')->text(); $this->assertEqual($crit1, 'Effort'); $crit2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria1Criteria')->text(); $this->assertEqual($crit2, 'Participation'); $crit3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria2Criteria')->text(); $this->assertEqual($crit3, 'Punctuality'); - - $crit1com1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, + + $crit1com1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria0RubricsCriteriaComment0CriteriaComment')->text(); $this->assertEqual($crit1com1, 'Does a sloppy job.'); $crit1com2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, @@ -261,7 +261,7 @@ public function testCopyRubric() $crit1com4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria0RubricsCriteriaComment3CriteriaComment')->text(); $this->assertEqual($crit1com4, 'Willing to help others as well'); - + $crit2com1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria1RubricsCriteriaComment0CriteriaComment')->text(); $this->assertEqual($crit2com1, 'Does not attend meetings regularly'); @@ -274,20 +274,20 @@ public function testCopyRubric() $crit2com4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria1RubricsCriteriaComment3CriteriaComment')->text(); $this->assertEqual($crit2com4, 'Continually led the group in the right direction'); - - $crit3com1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, + + $crit3com1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria2RubricsCriteriaComment0CriteriaComment')->text(); $this->assertEqual($crit3com1, 'Always late'); - $crit3com2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, + $crit3com2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria2RubricsCriteriaComment1CriteriaComment')->text(); $this->assertEqual($crit3com2, 'On time most of the time'); - $crit3com3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, + $crit3com3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria2RubricsCriteriaComment2CriteriaComment')->text(); $this->assertEqual($crit3com3, 'On time all of the time'); - $crit3com4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, + $crit3com4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteria2RubricsCriteriaComment3CriteriaComment')->text(); $this->assertEqual($crit3com4, 'Always early'); - + $crit1mrk1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark00')->attribute('value'); $this->assertEqual($crit1mrk1, 0); $crit1mrk2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark01')->attribute('value'); @@ -296,7 +296,7 @@ public function testCopyRubric() $this->assertEqual($crit1mrk3, 3.33); $crit1mrk4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark03')->attribute('value'); $this->assertEqual($crit1mrk4, 5); - + $crit2mrk1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark10')->attribute('value'); $this->assertEqual($crit2mrk1, 0); $crit2mrk2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark11')->attribute('value'); @@ -305,7 +305,7 @@ public function testCopyRubric() $this->assertEqual($crit2mrk3, 2.67); $crit2mrk4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark13')->attribute('value'); $this->assertEqual($crit2mrk4, 4); - + $crit3mrk1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark20')->attribute('value'); $this->assertEqual($crit3mrk1, 0); $crit3mrk2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark21')->attribute('value'); @@ -313,8 +313,8 @@ public function testCopyRubric() $crit3mrk3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark22')->attribute('value'); $this->assertEqual($crit3mrk3, 4.67); $crit3mrk4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'RubricsCriteriaMark23')->attribute('value'); - $this->assertEqual($crit3mrk4, 7); - + $this->assertEqual($crit3mrk4, 7); + $crit1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="RubricsCriteria0Multiplier"] option[selected="selected"]')->text(); $this->assertEqual($crit1, 5); @@ -324,11 +324,11 @@ public function testCopyRubric() $crit3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="RubricsCriteria2Multiplier"] option[selected="selected"]')->text(); $this->assertEqual($crit3, 7); - + $total = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'total')->attribute('value'); $this->assertEqual($total, 16); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit-rubric')->click(); - + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { @@ -337,14 +337,14 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The rubric was added successfully.'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Copy of Final Project Evaluation')->click(); $this->session->open(str_replace('view', 'delete', $this->session->url())); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The rubric was deleted successfully.'); $this->waitForLogoutLogin('root'); } - + public function testDeleteRubric() { $this->session->open($this->url.'rubrics/delete/'.$this->rubricId); @@ -357,4 +357,4 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The rubric was deleted successfully.'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/student_simple.test.php b/app/tests/cases/system/student_simple.test.php index b15d8f4f4..2550bd8ce 100644 --- a/app/tests/cases/system/student_simple.test.php +++ b/app/tests/cases/system/student_simple.test.php @@ -4,7 +4,7 @@ class studentSimple extends SystemBaseTestCase { protected $eventId = 0; - + public function startCase() { $this->getUrl(); @@ -13,19 +13,19 @@ public function startCase() $this->web_driver = new SystemWebDriver($wd_host); $this->session = $this->web_driver->session('firefox'); $this->session->open($this->url); - + $w = new PHPWebDriver_WebDriverWait($this->session); $this->session->deleteAllCookies(); $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testCreateEvent() { $this->session->open($this->url.'events/add/1'); @@ -47,11 +47,11 @@ public function testCreateEvent() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateEnd')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[title="Next"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, '28')->click(); - + // add penalty $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Penalty')->click();; $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="Penalty0PercentPenalty"] option[value="10"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="GroupGroup"] option[value="1"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="GroupGroup"] option[value="2"]')->click(); @@ -65,34 +65,34 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Add event successful!'); } - + public function testStudent() { $this->waitForLogoutLogin('redshirt0001'); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Home'); - + $pending = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[class="eventSummary pending"]')->text(); // check that there is at least one pending event $this->assertEqual(substr($pending, -22), 'Pending Event(s) Total'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation')->click(); - + // check the submit button is disabled $submit = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit Evaluation"]'); $this->assertTrue($submit->attribute('disabled')); // check the instructions for comments $comment = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); - $this->assertEqual($comment->text(), '(Must)'); + $this->assertEqual($comment->text(), '(Required)'); // check penalty note $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, '( Show/Hide late penalty policy )')->click(); $penalty = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'penalty')->text(); - $this->assertEqual($penalty, "1 day late: 10% deduction.\n10% is deducted afterwards."); - + $this->assertEqual($penalty, "1 day(s) late: 10% deduction.\n10% is deducted afterwards."); + // move the sliders $this->handleOffset('handle6', 24); $this->handleOffset('handle7', -25); - + // wait for distribution to finish $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'distr_button')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); @@ -107,18 +107,18 @@ function($session) { $matt = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'point7')->attribute('value'); $this->assertEqual($alex, 140); $this->assertEqual($matt, 60); - + $warning = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'statusMsg')->text(); $this->assertEqual($warning, "All points are allocated.\nThere are still 2 comments to be filled."); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'comment6')->sendKeys('A very great group member'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'comment7')->sendKeys('Very responsible.'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'comment6')->click(); - + $warning = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'statusMsg')->text(); $this->assertEqual($warning, "All points are allocated.\nAll comments are filled."); - - $submit->click(); + + $submit->click(); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); @@ -127,7 +127,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your Evaluation was submitted successfully.'); } - + public function testReSubmit() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation')->click(); @@ -147,7 +147,7 @@ function($session) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'point7')->sendKeys($delete->key.$delete->key.'80'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'comment7')->click(); - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit0')->click(); + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit0')->click(); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); @@ -155,13 +155,13 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your Evaluation was submitted successfully.'); - + // test negative points $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'point6')->sendKeys($delete->key.$delete->key.$delete->key.'-100'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'point7')->sendKeys($delete->key.$delete->key.'300'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'comment7')->click(); - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit0')->click(); + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit0')->click(); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, "flashMessage")); @@ -169,20 +169,20 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')->text(); $this->assertEqual($msg, 'One or more of your group members have negative points. Please use positive numbers.'); - + $this->secondStudent(); $this->tutor(); } - + public function testCheckResult() { $this->waitForLogoutLogin('root'); $this->removeFromGroup(); - + $this->session->open($this->url.'events/index/1'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation')->click(); $this->eventId = end(explode('/', $this->session->url())); - + // edit event's release date end to test final penalty // edit event's result release date begin to test student view of the results $this->session->open($this->url.'events/edit/'.$this->eventId); @@ -191,21 +191,21 @@ public function testCheckResult() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateBegin')->clear(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateBegin')->sendKeys(date('Y-m-d H:i:s')); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit"]')->click(); - $w = new PHPWebDriver_WebDriverWait($this->session); + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $this->session->open($this->url.'evaluations/view/'.$this->eventId); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'MECH 328 - Mechanical Engineering Design Project > Simple Evaluation > Results'); - + //auto-release results message $msg = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'autoRelease_msg'); $this->assertTrue(!empty($msg)); - + // check lates $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, '3 Late')->click(); $ed = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td[4]'); @@ -216,7 +216,7 @@ function($session) { $this->assertEqual($matt->text(), '(not submitted)'); $matt = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[4]/td[4]'); $this->assertEqual($matt->text(), '---'); - + // view evaluation results $this->session->open($this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/1'); // check members that are not enrolled and have not completed @@ -228,13 +228,13 @@ function($session) { $this->assertEqual($left, 'Left the group, but had submitted or were evaluated'); $left = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]/tbody/tr[2]/td')->text(); $this->assertEqual($left, 'Tutor 1 (TA)'); - + // auto-release results messages $msg = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'autoRelease_msg'); $this->assertTrue(!empty($msg)); $msg = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'li[class="green"]'); $this->assertTrue(!empty($msg)); - + // check summary table // colour coding names $matt = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[2]/th[3]'); @@ -248,39 +248,39 @@ function($session) { $this->assertEqual($matt->attribute('class'), 'red'); $tutor1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm2"]/h3[3]'); $this->assertEqual($tutor1->attribute('class'), 'blue'); - + // check that the individual marks given are correct for Ed $mark1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[3]/td[1]')->text(); - $mark2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[3]/td[2]')->text(); + $mark2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[3]/td[2]')->text(); $mark3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[3]/td[3]')->text(); $this->assertEqual($mark1, '-'); $this->assertEqual($mark2, '120.00'); $this->assertEqual($mark3, '80.00'); - + // check that the individual marks given are correct for Alex $mark1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[4]/td[1]')->text(); - $mark2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[4]/td[2]')->text(); + $mark2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[4]/td[2]')->text(); $mark3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[4]/td[3]')->text(); $this->assertEqual($mark1, '95.00'); $this->assertEqual($mark2, '-'); $this->assertEqual($mark3, '105.00'); - + // check that the individual marks given are correct for Matt $mark1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[5]/td[1]')->text(); - $mark2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[5]/td[2]')->text(); + $mark2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[5]/td[2]')->text(); $mark3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[5]/td[3]')->text(); $this->assertEqual($mark1, '-'); $this->assertEqual($mark2, '-'); $this->assertEqual($mark3, '-'); - + // check that the individual marks given are correct for Tutor 1 $mark1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[6]/td[1]')->text(); - $mark2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[6]/td[2]')->text(); + $mark2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[6]/td[2]')->text(); $mark3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[6]/td[3]')->text(); $this->assertEqual($mark1, '100.00'); $this->assertEqual($mark2, '100.00'); $this->assertEqual($mark3, '100.00'); - + // total $total1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[8]/td[1]')->text(); $total2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[8]/td[2]')->text(); @@ -288,7 +288,7 @@ function($session) { $this->assertEqual($total1, '195.00'); $this->assertEqual($total2, '220.00'); $this->assertEqual($total3, '285.00'); - + // penalty $penalty1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[9]/td[1]')->text(); $penalty2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[9]/td[2]')->text(); @@ -296,7 +296,7 @@ function($session) { $this->assertEqual($penalty1, '19.50 (10%)'); $this->assertEqual($penalty2, '22.00 (10%)'); $this->assertEqual($penalty3, '28.50 (10%)'); - + // final mark $final1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[10]/td[1]')->text(); $final2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[10]/td[2]')->text(); @@ -304,7 +304,7 @@ function($session) { $this->assertEqual($final1, '175.50'); $this->assertEqual($final2, '198.00'); $this->assertEqual($final3, '256.50'); - + // num $num1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[11]/td[1]')->text(); $num2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[11]/td[2]')->text(); @@ -312,7 +312,7 @@ function($session) { $this->assertEqual($num1, '2'); $this->assertEqual($num2, '2'); $this->assertEqual($num3, '3'); - + // average $avg1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[12]/td[1]')->text(); $avg2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[12]/td[2]')->text(); @@ -320,7 +320,7 @@ function($session) { $this->assertEqual($avg1, '87.75'); $this->assertEqual($avg2, '99.00'); $this->assertEqual($avg3, '85.5'); - + // check the comments are correct $com1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm2"]/table[1]/tbody/tr[2]/td[2]')->text(); $com2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm2"]/table[1]/tbody/tr[3]/td[2]')->text(); @@ -336,12 +336,12 @@ function($session) { $this->assertEqual($com5, 'Does his fair share of work'); $this->assertEqual($com6, 'Knows what he is doing'); $this->assertEqual($com7, 'Does his work efficiently'); - + // colour coding for Tutor in comments section $tutor = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm2"]/h3[3]'); $this->assertEqual($tutor->attribute('class'), 'blue'); } - + public function testStudentViewResults() { $this->waitForLogoutLogin('redshirt0003'); @@ -356,16 +356,16 @@ public function testStudentViewResults() sort($comments); $this->assertEqual($comments[0], 'A great leader'); $this->assertEqual($comments[1], 'Does his work efficiently'); - $this->assertEqual($comments[2], 'Very responsible.'); + $this->assertEqual($comments[2], 'Very responsible.'); } - + public function testNoDetails() { $this->waitForLogoutLogin('root'); $this->session->open($this->url.'events/edit/'.$this->eventId); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventEnableDetails0')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit"]')->click(); - $w = new PHPWebDriver_WebDriverWait($this->session); + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); @@ -380,7 +380,7 @@ function($session) { $comments = $this->session->elements(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]'); $this->assertTrue(empty($comments)); } - + public function testTutorInInstructorView() { $this->waitForLogoutLogin('root'); @@ -396,20 +396,20 @@ public function testTutorInInstructorView() $tutor = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm2"]/h3[3]'); $this->assertFalse($tutor->attribute('class')); } - + public function testRelease() { $this->session->open($this->url.'events/edit/'.$this->eventId); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventAutoRelease0')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventEnableDetails1')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit"]')->click(); - $w = new PHPWebDriver_WebDriverWait($this->session); + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + // release Ed's grades $this->session->open($this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/1'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[13]/td[2]/button')->click(); @@ -436,7 +436,7 @@ function($session) { $this->session->open($this->url.'evaluations/view/'.$this->eventId); $review = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="ajaxListDiv"]/div/table/tbody/tr[2]/td[6]/div'); $this->assertEqual($review->text(), 'Reviewed'); - + // check Ed's results $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation')->click(); @@ -448,7 +448,7 @@ function($session) { $this->assertTrue(empty($comment)); $comment = $this->session->elements(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]/tbody/tr[2]/td'); $this->assertTrue(empty($comment)); - + // check Alex's results $this->waitForLogoutLogin('redshirt0002'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation')->click(); @@ -460,7 +460,7 @@ function($session) { $this->assertEqual($comment->text(), 'A very great group member'); $comment = $this->session->elements(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]/tbody/tr[3]/td'); $this->assertTrue(empty($comment)); - + // check Matt's results $this->waitForLogoutLogin('redshirt0003'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation')->click(); @@ -473,13 +473,13 @@ function($session) { $comment = $this->session->elements(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]/tbody/tr[2]/td'); $this->assertTrue(empty($comment)); } - + public function testReleaseAllComments() { $this->waitForLogoutLogin('root'); $this->session->open($this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/1'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Release All"]')->click(); - + $this->waitForLogoutLogin('redshirt0003'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[3]/tbody/tr[2]/td[1]'); @@ -492,15 +492,15 @@ public function testReleaseAllComments() sort($comments); $this->assertEqual($comments[0], 'A great leader'); $this->assertEqual($comments[1], 'Does his work efficiently'); - $this->assertEqual($comments[2], 'Very responsible.'); + $this->assertEqual($comments[2], 'Very responsible.'); } - + public function testUnreleaseAllComments() { $this->waitForLogoutLogin('root'); $this->session->open($this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/1'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Unrelease All"]')->click(); - + $this->waitForLogoutLogin('redshirt0003'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[3]/tbody/tr[2]/td[1]'); @@ -512,7 +512,7 @@ public function testUnreleaseAllComments() $comment = $this->session->elements(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]/tbody/tr[2]/td'); $this->assertTrue(empty($comment)); } - + public function testSubmissionsAfterEvalReleased() { // when a submission is made after grades and comments have been released @@ -559,7 +559,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + // check Ed Student's results - grades not released (Matt's not released) // comments (only two comments are released) $this->waitForLogoutLogin('redshirt0001'); @@ -576,7 +576,7 @@ function($session) { // comment 'not show up' is not part of the list of comments $comm3 = $this->session->elements(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]/tbody/tr[4]/td'); $this->assertTrue(empty($comm3)); - + // Matt Student's grades are released $this->waitForLogoutLogin('redshirt0003'); $simple = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Simple Evaluation'); @@ -593,7 +593,7 @@ function($session) { $this->assertEqual($comm1[1], 'Does his work efficiently'); $this->assertEqual($comm1[2], 'Very responsible.'); } - + public function testDeleteEvent() { $this->waitForLogoutLogin('root'); @@ -607,7 +607,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The event has been deleted successfully.'); } - + public function handleOffset($id, $offset) { $handle = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, $id); @@ -616,7 +616,7 @@ public function handleOffset($id, $offset) $this->session->moveto(array('xoffset' => $offset, 'yoffset' => 0)); $this->session->buttonup(); } - + public function secondStudent() { $this->waitForLogoutLogin('redshirt0002'); @@ -634,7 +634,7 @@ function($session) { } ); } - + public function tutor() { $this->waitForLogoutLogin('tutor1'); @@ -654,7 +654,7 @@ function($session) { } ); } - + public function removeFromGroup() { $this->session->open($this->url.'groups/edit/1'); @@ -670,7 +670,7 @@ function($session) { } ); } - + public function assignToGroup() { $this->session->open($this->url.'groups/edit/1'); @@ -684,4 +684,4 @@ function($session) { } ); } -} \ No newline at end of file +} diff --git a/app/vendors/simpletest/test/eclipse_test.php b/app/vendors/simpletest/test/eclipse_test.php index 0cc1f43eb..44cae4890 100644 --- a/app/vendors/simpletest/test/eclipse_test.php +++ b/app/vendors/simpletest/test/eclipse_test.php @@ -1,32 +1,32 @@ expectOnce('write',array($expected)); $listener->setReturnValue('write',-1); - + $pathparts = pathinfo($fullpath); $filename = $pathparts['basename']; - $test= &new TestSuite($filename); + $test= new TestSuite($filename); $test->addTestFile($fullpath); - $test->run(new EclipseReporter(&$listener)); + $test->run(new EclipseReporter($listener)); $this->assertEqual($expected,$listener->output); } } -?> \ No newline at end of file +?> From 0797774a9ed57a6c687d75f08992f490ca62e7e7 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Tue, 18 Feb 2014 16:14:33 -0800 Subject: [PATCH 42/91] fixed running tests on browser iPeer is now running on port 2000 on the host machine --- Vagrantfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Vagrantfile b/Vagrantfile index 799354c5b..17f0fbc8c 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -26,7 +26,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.provision :shell, :path => "puppet/bootstrap.sh" - config.vm.network :forwarded_port, host: 8080, guest: 2000 + config.vm.network :forwarded_port, host: 2000, guest: 2000 # The url from where the 'config.vm.box' box will be fetched if it # doesn't already exist on the user's system. From f8b5b6f138fcb44adb1cc40ccaefc141f083f667 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 24 Feb 2014 13:45:11 -0800 Subject: [PATCH 43/91] modified the readme documentation I have updated the readme documentation to include instructions on using a different port than 2000. --- puppet/modules/firewall | 2 +- puppet/modules/ipeer | 2 +- puppet/modules/mysql | 2 +- readme.md | 38 +++++++++++++++++++++++++------------- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/puppet/modules/firewall b/puppet/modules/firewall index 1b870e27a..863bbed2a 160000 --- a/puppet/modules/firewall +++ b/puppet/modules/firewall @@ -1 +1 @@ -Subproject commit 1b870e27acfc20aedc82f8f8a178b56d17aeb30c +Subproject commit 863bbed2aa0f9a9ee4c1f961de466963d3451c1e diff --git a/puppet/modules/ipeer b/puppet/modules/ipeer index 53885d95f..96d91979d 160000 --- a/puppet/modules/ipeer +++ b/puppet/modules/ipeer @@ -1 +1 @@ -Subproject commit 53885d95fc8a9f3262847d1604191057288b2b6a +Subproject commit 96d91979d7734fa3f45d3243bc8f6bbf224650cc diff --git a/puppet/modules/mysql b/puppet/modules/mysql index 84fc716b2..1bc459d05 160000 --- a/puppet/modules/mysql +++ b/puppet/modules/mysql @@ -1 +1 @@ -Subproject commit 84fc716b24bf6aa37f8997f0afcccaf262176e52 +Subproject commit 1bc459d05bb43c5937fae6e65b7c77659432c76b diff --git a/readme.md b/readme.md index 1924147a6..c67a7366e 100644 --- a/readme.md +++ b/readme.md @@ -2,21 +2,33 @@ Running Virtual Development Server --------------------------- Virtual Environment Setup: -1) Install VirtualBox at http://virtualbox.org -2) Install Vagrant at http://www.vagrantup.com/downloads -3) Go to the iPeer root directory in the terminal -4) Initial the submodules: git submodule init -5) Update the submodules: git submodule update -6) Create a Vagrant box: vagrant box add ipeerbox http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box -7) Install Virtual Box Guest Addition plugin: vagrant plugin install vagrant-vbguest -8) Start the virtual server: vagrant up -9) Go to localhost:2000 in your browser. +1. Install VirtualBox at http://virtualbox.org +2. Install Vagrant at http://www.vagrantup.com/downloads +3. Go to the iPeer root directory in the terminal. Then run the following commands: + git submodule init + git submodule update + vagrant box add ipeerbox http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box + vagrant plugin install vagrant-vbguest + vagrant up +4. Go to localhost:2000 in your browser. + +Using a different port (must be the same port number in the virtual and host environment): + +1. change the line in file puppet/dev.pp from + port => 2000, +to (eg. port 8888) + port => 8888, +2. AND change the line in file app/tests/cases/controllers/v1_controller.test.php from + $server = 'http://localhost:2000'; +to + $server = 'http://localhost:8888'; Running Tests: -1) ssh into the virtual environment: vagrant ssh -2) Go to the application’s root directory: cd /var/www -3) Run tests: phing test +Go to the iPeer root directory. Then run the following commands + vagrant ssh + cd /var/www + phing test For more vagrant commands go to http://docs.vagrantup.com/v2/cli/index.html. @@ -29,7 +41,7 @@ Requirements: * PHP Webdriver (https://github.com/Element-34/php-webdriver) * Firfox -Ruuning the tests: +Runing the tests: cd iPeer cake/console/cake -app app testsuite app group system From cd9175c381a9bbff1b26dd1156640b2339043586 Mon Sep 17 00:00:00 2001 From: Compass Date: Thu, 27 Feb 2014 16:29:20 -0800 Subject: [PATCH 44/91] Update integration test to use environment vars Using environment vars to set up the test environment, available variables with default values including: SELENIUM_PLATFORM => 'ANY' SELENIUM_VERSION => '' SELENIUM_BROWSER => 'firfox' SELENIUM_URL => 'http://localhost:4444/wd/hub' SERVER_TEST => 'http://localhost:2000' --- app/tests/cases/system/add_course.test.php | 12 +- app/tests/cases/system/add_event.test.php | 8 +- app/tests/cases/system/add_group.test.php | 64 +++--- app/tests/cases/system/add_mixeval.test.php | 116 +++++------ app/tests/cases/system/add_rubric.test.php | 8 +- app/tests/cases/system/add_simple.test.php | 8 +- app/tests/cases/system/add_survey.test.php | 96 ++++----- .../cases/system/auto_create_groups.test.php | 38 ++-- app/tests/cases/system/enrol_student.test.php | 76 ++++--- app/tests/cases/system/home.test.php | 38 ++-- app/tests/cases/system/import_groups.test.php | 38 ++-- app/tests/cases/system/import_users.test.php | 36 ++-- app/tests/cases/system/login.test.php | 7 +- app/tests/cases/system/mass_move.test.php | 110 +++++----- app/tests/cases/system/merge_users.test.php | 122 ++++++----- app/tests/cases/system/move_student.test.php | 92 ++++---- app/tests/cases/system/oauth_client.test.php | 44 ++-- app/tests/cases/system/oauth_token.test.php | 44 ++-- .../cases/system/permissions_editor.test.php | 58 +++--- .../cases/system/student_mixeval.test.php | 196 +++++++++--------- .../cases/system/student_rubric.test.php | 176 ++++++++-------- .../cases/system/student_simple.test.php | 8 +- .../cases/system/student_survey.test.php | 72 +++---- app/tests/cases/system/system_base.php | 43 ++-- 24 files changed, 695 insertions(+), 815 deletions(-) diff --git a/app/tests/cases/system/add_course.test.php b/app/tests/cases/system/add_course.test.php index d9e6c75fc..341e4fafd 100644 --- a/app/tests/cases/system/add_course.test.php +++ b/app/tests/cases/system/add_course.test.php @@ -5,23 +5,17 @@ class AddCourseTestCase extends SystemBaseTestCase { public function startCase() { - $this->getUrl(); echo "Start AddCourse system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); + $this->getSession()->open($this->url); - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } public function endCase() { - $this->session->deleteAllCookies(); - $this->session->close(); + $this->getSession()->deleteAllCookies(); + $this->getSession()->close(); } public function testAddCourse() diff --git a/app/tests/cases/system/add_event.test.php b/app/tests/cases/system/add_event.test.php index 0c2062ec2..c6f11726f 100644 --- a/app/tests/cases/system/add_event.test.php +++ b/app/tests/cases/system/add_event.test.php @@ -5,15 +5,9 @@ class addEventTestCase extends SystemBaseTestCase { public function startCase() { - $this->getUrl(); echo "Start AddEvent system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); + $this->getSession()->open($this->url); - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('instructor1', 'ipeeripeer'); } diff --git a/app/tests/cases/system/add_group.test.php b/app/tests/cases/system/add_group.test.php index e06c60096..f0ea83274 100644 --- a/app/tests/cases/system/add_group.test.php +++ b/app/tests/cases/system/add_group.test.php @@ -4,64 +4,58 @@ class AddGroupTestCase extends SystemBaseTestCase { protected $groupId = 0; - + public function startCase() { - $this->getUrl(); echo "Start AddGroup system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testAddGroup() { $this->session->open($this->url.'courses/home/2'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Create Groups (Manual)')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'APSC 201 - Technical Communication > Add Group'); - + $groupNum = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'GroupGroupNum'); $this->assertEqual($groupNum->attribute('value'), 1); $this->assertTrue($groupNum->attribute('readonly')); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CLASS_NAME, 'error-message')->text(); $this->assertEqual($msg, 'Please insert group name'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'GroupGroupName')->sendKeys(' Amazing Group '); - + // adding Geoff Student $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="all_groups"] option[value="30"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Assign >>"]')->click(); - + // adding Van Hong Student $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="all_groups"] option[value="27"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Assign >>"]')->click(); - + // adding Denny Student $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="all_groups"] option[value="18"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Assign >>"]')->click(); - + // adding Trevor Student $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="all_groups"] option[value="23"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Assign >>"]')->click(); - + $count = count($this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="selected_groups"] option')); $this->assertEqual($count, 4); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -69,10 +63,10 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The group was added successfully.'); - + // checking duplicate group name error $this->session->open($this->url.'groups/add/2'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'GroupGroupName')->sendKeys(' Amazing Group '); @@ -89,16 +83,16 @@ function($session) { $this->assertEqual($msg->text(), 'A group with the name already exists.'); $this->session->open($this->url.'groups/index/2'); } - + public function testEditGroup() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Amazing Group (4 members)')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'APSC 201 - Technical Communication > Groups > View'); $this->groupId = end(explode('/', $this->session->url())); - + $this->checkViewLinks(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Edit this Group')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); // check that no duplicate name error appears @@ -111,7 +105,7 @@ function($session) { $this->session->open($this->url.'groups/edit/'.$this->groupId); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'GroupGroupName')->sendKeys(' Two'); - + // removing Van Hong Student $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="selected_groups"] option[value="30"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="selected_groups"] option[value="18"]')->click(); @@ -120,7 +114,7 @@ function($session) { $count = count($this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="selected_groups"] option')); $this->assertEqual($count, 3); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -128,11 +122,11 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The group was updated successfully.'); } - + public function testDeleteGroup() { $this->session->open($this->url.'groups/delete/'.$this->groupId); @@ -142,11 +136,11 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The group was deleted successfully.'); } - + public function checkViewLinks() { $emails = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::PARTIAL_LINK_TEXT, 'Email'); @@ -155,11 +149,11 @@ public function checkViewLinks() $this->assertTrue(strpos($emails[2]->attribute('href'), 'emailer/write/U/27')); $this->assertTrue(strpos($emails[3]->attribute('href'), 'emailer/write/U/30')); $this->assertTrue(strpos($emails[4]->attribute('href'), 'emailer/write/G/'.$this->groupId)); - + $back = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Back to Group Listing'); $this->assertTrue(strpos($back->attribute('href'), 'groups/index/2')); - - + + $view = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[href="/users/view/18"]'); $this->assertTrue(!empty($view)); $view = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[href="/users/view/23"]'); @@ -169,4 +163,4 @@ public function checkViewLinks() $view = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[href="/users/view/30"]'); $this->assertTrue(!empty($view)); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/add_mixeval.test.php b/app/tests/cases/system/add_mixeval.test.php index d2f62886e..15e918276 100644 --- a/app/tests/cases/system/add_mixeval.test.php +++ b/app/tests/cases/system/add_mixeval.test.php @@ -2,36 +2,30 @@ require_once('system_base.php'); class AddMixEvalTestCase extends SystemBaseTestCase -{ +{ protected $mixeval = ''; public function startCase() { - $this->getUrl(); echo "Start AddMixeval system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testAddMixEval() { $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Home'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Evaluation')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Evaluation Tools'); @@ -39,32 +33,32 @@ public function testAddMixEval() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluations')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Mixed Evaluations'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Mixed Evaluation')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Mixed Evaluations > Add'); - + // template info $name = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalName'); $name->sendKeys('Final Project Evaluation'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalAvailabilityPublic')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalZeroMark')->click(); } - - public function testAddLikert() + + public function testAddLikert() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[type="button"]')->click(); - + $question = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion0Title'); $question->sendKeys('In your opinion, how is their work ethics?'); - + $instructions = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion0Instructions'); $instructions->sendKeys('Please be honest.'); - + $marks = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, "MixevalQuestion0Multiplier"); $marks->sendKeys('8'); - + $add = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[onclick="addDesc(0);"]'); for ($i=0; $i<5; $i++) { $add->click(); @@ -81,33 +75,33 @@ function($session) { $desc->sendKeys($mark.' marks'); } } - + public function testAddSentence() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="MixevalMixevalQuestionTypePeer"] option[value="3"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[onclick="insertQ(false);"]')->click(); - + $question = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion1Title'); $question->sendKeys('Which part of the project was their greatest contribution?'); - + $instructions = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion1Instructions'); $instructions->sendKeys('Choose one of the following: Research, Report, Presentation.'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion1Required')->click(); } - + public function testAddParagraph() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="MixevalMixevalQuestionTypePeer"] option[value="2"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[onclick="insertQ(false);"]')->click(); - + $question = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion2Title'); $question->sendKeys('What have they done well? How can they improve?'); - + $instructions = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion2Instructions'); $instructions->sendKeys('Please give constructive comments.'); } - + public function testAddScoreDropdown() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="MixevalMixevalQuestionTypePeer"] option[value="4"]')->click(); @@ -115,13 +109,13 @@ public function testAddScoreDropdown() $question = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion3Title'); $question->sendKeys('Distributed Marks'); - + $instructions = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion3Instructions'); $instructions->sendKeys('Distribute the marks among your members.'); } - + public function testSubmitAndError() - { + { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[type="submit"]')->click(); // wait for creation of template to finish $w = new PHPWebDriver_WebDriverWait($this->session); @@ -130,7 +124,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The mixed evaluation was saved successfully.'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Default Mix Evaluation')->click(); @@ -141,11 +135,11 @@ function($session) { $this->session->open(str_replace('view', 'edit', $this->mixeval)); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')->text(); $this->assertEqual($msg, 'Default Mix Evaluation cannot be edited now that submissions have been made. Please make a copy.'); - + $this->session->open($this->url.'evaltools'); $eval = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Final Project Evaluation'); $this->assertTrue(!empty($eval)); - + $this->waitForLogoutLogin('instructor1'); $this->session->open($this->url.'mixevals/index'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Final Project Evaluation')->click(); @@ -174,7 +168,7 @@ public function testCopyTemplate() $this->assertNull($zero->attribute('checked')); $zero = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalZeroMark'); $this->assertTrue($zero->attribute('checked')); - + // 1st question - Likert $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion0Title'); $this->assertEqual($title->attribute('value'), 'In your opinion, how is their work ethics?'); @@ -194,7 +188,7 @@ public function testCopyTemplate() $this->assertEqual($desc4->attribute('value'), '6 marks'); $desc5 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestionDesc4Descriptor'); $this->assertEqual($desc5->attribute('value'), '8 marks'); - + // 2nd question - Sentence $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion1Title'); $this->assertEqual($title->attribute('value'), 'Which part of the project was their greatest contribution?'); @@ -202,7 +196,7 @@ public function testCopyTemplate() $this->assertEqual($instr->text(), 'Choose one of the following: Research, Report, Presentation.'); $req = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion1Required'); $this->assertNull($req->attribute('checked')); - + // 3rd question - Paragraph $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion2Title'); $this->assertEqual($title->attribute('value'), 'What have they done well? How can they improve?'); @@ -210,7 +204,7 @@ public function testCopyTemplate() $this->assertEqual($instr->text(), 'Please give constructive comments.'); $req = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion2Required'); $this->assertTrue($req->attribute('checked')); - + // save $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[type="submit"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); @@ -221,18 +215,18 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The mixed evaluation was saved successfully.'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Copy of Final Project Evaluation')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Mixed Evaluations > View > Copy of Final Project Evaluation'); - + // delete $this->session->open(str_replace('view', 'delete', $this->session->url())); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The Mixed Evaluation was removed successfully.'); $this->waitForLogoutLogin('root'); } - + public function testViewTemplate() { $this->session->open($this->mixeval); @@ -245,13 +239,13 @@ public function testViewTemplate() $total = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CLASS_NAME, 'marks')->text(); $this->assertEqual($total, 'Total Marks: 18'); } - + public function testEditTemplate() { $this->session->open(str_replace('view', 'edit', $this->mixeval)); // delete the score dropdown question $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[onclick="removeQ(3, 0); return false;"]')->click(); - + // moving questions // move up the first question $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[onclick="upQ(0, 0); return false;"]')->click(); @@ -292,7 +286,7 @@ function($session) { ); $quesNum = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'questionIndex1')->text(); $this->assertEqual($quesNum, '1.'); - + // adding question $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="MixevalMixevalQuestionTypePeer"] option[value="3"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[onclick="insertQ(false);"]')->click(); @@ -309,13 +303,13 @@ function($session) { return empty($ques); } ); - + // adding question $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="MixevalMixevalQuestionTypePeer"] option[value="2"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[onclick="insertQ(false);"]')->click(); $quesNum = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'questionIndex5')->text(); $this->assertEqual($quesNum, '1.'); - + // create template with one question $this->session->open($this->url.'mixevals/add'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="MixevalMixevalQuestionTypePeer"] option[value="2"]')->click(); @@ -339,22 +333,22 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The Mixed Evaluation was removed successfully.'); } - + public function testDeleteTemplate() { - $this->session->open($this->url.'mixevals/index'); + $this->session->open($this->url.'mixevals/index'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Final Project Evaluation')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Mixed Evaluations > View > Final Project Evaluation'); - + $templateId = end(explode('/', $this->session->url())); $this->session->open($this->url.'mixevals/delete/'.$templateId); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The Mixed Evaluation was removed successfully.'); } - + public function testSelfEvaluation() { $this->session->open($this->url.'mixevals/add'); @@ -363,7 +357,7 @@ public function testSelfEvaluation() $selfType = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalMixevalQuestionTypeSelf'); $this->assertTrue(!empty($selfType)); } - + public function testAddPeerQuestions() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[onclick="insertQ(false);"]')->click(); @@ -373,7 +367,7 @@ public function testAddPeerQuestions() $this->assertEqual($ques1, '1.'); $ques2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'questionIndex1')->text(); $this->assertEqual($ques2, '2.'); - + // question titles $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion0Title')->sendKeys('Peer optional'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion1Title')->sendKeys('Peer required'); @@ -388,7 +382,7 @@ public function testAddPeerQuestions() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[onclick="addDesc(1);"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[onclick="addDesc(1);"]')->click(); } - + public function testAddSelfQuestions() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[onclick="insertQ(true);"]')->click(); @@ -423,7 +417,7 @@ function($session) { } ); } - + public function testViewSelfEvaluation() { $peer = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="ajaxListDiv"]/div/table/tbody/tr[3]/td[4]/div'); @@ -432,7 +426,7 @@ public function testViewSelfEvaluation() $this->assertEqual($self->text(), '3'); $total = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="ajaxListDiv"]/div/table/tbody/tr[3]/td[6]/div'); $this->assertEqual($total->text(), '4'); - + // view evaluation $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'With Self-Evaluation')->click(); $this->mixeval = $this->session->url(); @@ -459,7 +453,7 @@ public function testViewSelfEvaluation() $mark = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CLASS_NAME, 'marks'); $this->assertEqual($mark->text(), 'Total Marks: 4'); } - + public function testEditSelfEvaluation() { $this->session->open(str_replace('view', 'edit', $this->mixeval)); @@ -477,7 +471,7 @@ public function testEditSelfEvaluation() $self3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion4Title'); $this->assertEqual($self3->attribute('value'), 'Self 3'); } - + public function testEditReorderSelfEvaluation() { // test first peer evaluation question going up @@ -496,7 +490,7 @@ public function testEditReorderSelfEvaluation() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[onclick="downQ(4, 1); return false;"]')->click(); $num = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'questionIndex4')->text(); $this->assertEqual($num, '3.'); - + // test moving questions around $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[onclick="downQ(0, 0); return false;"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); @@ -527,7 +521,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $this->session->open($this->mixeval); $peer1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/div[1]/h3'); $this->assertEqual($peer1->text(), "1. Peer required\n*"); @@ -545,4 +539,4 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The Mixed Evaluation was removed successfully.'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/add_rubric.test.php b/app/tests/cases/system/add_rubric.test.php index 20dff3435..63893fcc1 100644 --- a/app/tests/cases/system/add_rubric.test.php +++ b/app/tests/cases/system/add_rubric.test.php @@ -7,15 +7,9 @@ class addRubricTestCase extends SystemBaseTestCase public function startCase() { - $this->getUrl(); echo "Start AddRubric system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); + $this->getSession()->open($this->url); - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } diff --git a/app/tests/cases/system/add_simple.test.php b/app/tests/cases/system/add_simple.test.php index 86bcf99d3..9b23f50a3 100644 --- a/app/tests/cases/system/add_simple.test.php +++ b/app/tests/cases/system/add_simple.test.php @@ -7,15 +7,9 @@ class addSimpleTestCase extends SystemBaseTestCase public function startCase() { - $this->getUrl(); echo "Start AddSimple system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); + $this->getSession()->open($this->url); - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } diff --git a/app/tests/cases/system/add_survey.test.php b/app/tests/cases/system/add_survey.test.php index 46037c644..b1a1b4401 100644 --- a/app/tests/cases/system/add_survey.test.php +++ b/app/tests/cases/system/add_survey.test.php @@ -2,26 +2,20 @@ require_once('system_base.php'); class addSurveyTestCase extends SystemBaseTestCase -{ +{ public function startCase() { - $this->getUrl(); echo "Start AddSurvey system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testAddSurvey() { $this->session->open($this->url.'surveys/add'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'SurveyName')->sendKeys('grp making'); @@ -35,14 +29,14 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Survey is saved!'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'grp making')->click(); $surveyId = end(explode('/', $this->session->url())); $this->session->open($this->url.'surveys/questionsSummary/'.$surveyId); $this->addMC($surveyId); $this->addMultipleAnswers($surveyId); $this->addTextQues($surveyId); - + // check that the questions have been added correctly $this->session->open($this->url.'surveys/view/'.$surveyId); $radio = count($this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="radio"]')); @@ -53,22 +47,22 @@ function($session) { $this->assertEqual($text, 1); $textarea = count($this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'textarea')); $this->assertEqual($textarea, 1); - + // edit survey $this->session->open($this->url.'surveys/edit/'.$surveyId); $this->editSurvey(); - + // edit survey questions $this->session->open($this->url.'surveys/questionsSummary/'.$surveyId); $this->editQuestions(); - + // access $this->accessSurvey(); - + // copy survey $this->session->open($this->url.'surveys/copy/'.$surveyId); $this->copySurvey(); - + // delete survey template & their questions $this->session->open($this->url.'surveys/questionsSummary/'.$surveyId); $this->deleteQues(); @@ -85,11 +79,11 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The survey was deleted successfully.'); } - + public function addMC($surveyId) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[type="submit"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'QuestionPrompt')->sendKeys('What year are you in your program?'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Response')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'Response0Response')->sendKeys('1st'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Response')->click(); @@ -100,7 +94,7 @@ public function addMC($surveyId) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'Response3Response')->sendKeys('4th'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Response')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'Response4Response')->sendKeys('5th +'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Save Question"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -111,14 +105,14 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The question was added successfully.'); } - + public function addMultipleAnswers($surveyId) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[type="submit"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'QuestionPrompt')->sendKeys('Which operating systems have you used before?'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="QuestionType"] option[value="C"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="QuestionMaster"] option[value="yes"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Response')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'Response0Response')->sendKeys('Windows'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Response')->click(); @@ -127,7 +121,7 @@ public function addMultipleAnswers($surveyId) $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'Response2Response')->sendKeys('Linux'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Response')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'Response3Response')->sendKeys('Chrome'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Save Question"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -138,7 +132,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The question was added successfully.'); } - + public function addTextQues($surveyId) { // short answer @@ -147,7 +141,7 @@ public function addTextQues($surveyId) $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="QuestionType"] option[value="S"]')->click(); $masterQ = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="QuestionTemplateId"] option'); $this->assertEqual(count($masterQ), 2); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Save Question"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -157,12 +151,12 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The question was added successfully.'); - + // long answer $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[type="submit"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'QuestionPrompt')->sendKeys('Tell me a little bit about yourself.'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="QuestionType"] option[value="L"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Save Question"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -203,7 +197,7 @@ public function editQuestions() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Save Question"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The question was updated successfully.'); - + // edit multiple answers $edits = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Edit'); $this->session->open($edits[1]->attribute('href')); @@ -215,7 +209,7 @@ public function editQuestions() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Save Question"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The question was updated successfully.'); - + // edit sentence question $edits = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Edit'); $this->session->open($edits[2]->attribute('href')); @@ -227,7 +221,7 @@ public function editQuestions() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Save Question"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The question was updated successfully.'); - + // edit paragraph question $edits = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Edit'); $this->session->open($edits[3]->attribute('href')); @@ -237,23 +231,23 @@ public function editQuestions() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Save Question"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The question was updated successfully.'); - + // checking 1st question $options = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="radio"]'); $this->assertEqual(count($options), 4); $lastOp = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, "/html/body/div[1]/div[4]/div[2]/label[4]"); $this->assertEqual($lastOp->text(), '4th +'); - + // checking 2nd question $options = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="checkbox"]'); $this->assertEqual(count($options), 3); $lastOp = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, "/html/body/div[1]/div[4]/div[5]/div[2]/label"); $this->assertEqual($lastOp->text(), 'Mac OS X'); - + // checking last two questions $text = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="text"]'); $this->assertEqual(count($text), 2); - + // move questions $bottom = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Bottom'); $bottom[0]->click(); @@ -263,13 +257,13 @@ public function editQuestions() $down[1]->click(); $up = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Up'); $up[1]->click(); - + $prompts = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CLASS_NAME, 'prompt'); $this->assertEqual($prompts[0]->text(), '1. Which part of the course are you most looking forward to?'); $this->assertEqual($prompts[1]->text(), '2. Tell me a little bit about yourself.'); $this->assertEqual($prompts[2]->text(), '3. Which OS will you be programming in?'); $this->assertEqual($prompts[3]->text(), '4. What year are you in?'); - + // load master question $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[type="submit"]')->click(); $templates = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="QuestionTemplateId"] option'); @@ -302,7 +296,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The question was added successfully.'); } - + public function copySurvey() { $name = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'SurveyName'); @@ -318,18 +312,18 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Survey is saved!'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Copy of Group Making Survey')->click(); $prompts = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CLASS_NAME, 'prompt'); $this->assertEqual($prompts[0]->text(), '1. Which part of the course are you most looking forward to?'); $this->assertEqual($prompts[1]->text(), '2. Tell me a little bit about yourself.'); $this->assertEqual($prompts[2]->text(), '3. Which OS will you be programming in?'); - $this->assertEqual($prompts[3]->text(), '4. What year are you in?'); - + $this->assertEqual($prompts[3]->text(), '4. What year are you in?'); + // there should be two textfields $text = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="text"]'); $this->assertEqual(count($text), 2); - + // 3 checkboxes $check = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[class="checkbox"] label'); $this->assertEqual(count($check), 6); @@ -339,7 +333,7 @@ function($session) { $this->assertEqual($check[3]->text(), 'Windows'); $this->assertEqual($check[4]->text(), 'Mac OS X'); $this->assertEqual($check[5]->text(), 'Linux'); - + // 4 radio buttons $radio = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[class="input radio"] label'); $this->assertEqual(count($radio), 4); @@ -347,7 +341,7 @@ function($session) { $this->assertEqual($radio[1]->text(), '2nd'); $this->assertEqual($radio[2]->text(), '3rd'); $this->assertEqual($radio[3]->text(), '4th +'); - + // delete $this->session->open(str_replace('view', 'questionsSummary', $this->session->url())); $this->deleteQues(); @@ -364,7 +358,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The survey was deleted successfully.'); } - + public function accessSurvey() { $this->session->open($this->url.'surveys'); @@ -384,7 +378,7 @@ public function accessSurvey() $this->session->open($this->url.'evaltools'); $mySurvey = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Group Making Survey'); $this->assertTrue(!empty($mySurvey)); - + $this->waitForLogoutLogin('instructor1'); $this->session->open($this->url.'surveys'); // public survey (in use) @@ -399,7 +393,7 @@ public function accessSurvey() $this->session->open(str_replace('view', 'delete', $url)); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')->text(); $this->assertEqual(substr($msg, 0, 26), 'Submissions had been made.'); - + // public survey (not in use) but not the creator $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Group Making Survey')->click(); $url = $this->session->url(); @@ -412,15 +406,15 @@ public function accessSurvey() $this->session->open(str_replace('view', 'delete', $url)); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')->text(); $this->assertEqual($msg, 'Error: You do not have permission to delete this survey'); - + // All My Tools $this->session->open($this->url.'evaltools'); $mySurvey = $this->session->elements(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Group Making Survey'); $this->assertTrue(empty($mySurvey)); - + $this->waitForLogoutLogin('root'); } - + public function deleteQues() { $delete = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Delete')->click(); @@ -434,4 +428,4 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The question was removed successfully.'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/auto_create_groups.test.php b/app/tests/cases/system/auto_create_groups.test.php index 4b25b8678..d284e5db6 100644 --- a/app/tests/cases/system/auto_create_groups.test.php +++ b/app/tests/cases/system/auto_create_groups.test.php @@ -7,32 +7,26 @@ class autoCreateGroupsTestCase extends SystemBaseTestCase public function startCase() { - $this->getUrl(); echo "Start AutoCreateGroups system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testErrorChecking() { $this->session->open($this->url.'surveygroups/makegroups/2'); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::TAG_NAME, 'h3')->text(); $this->assertEqual($msg, 'No survey event found for this course!'); } - + public function testStepOne() { $this->session->open($this->url.'courses/home/1'); @@ -41,7 +35,7 @@ public function testStepOne() $this->assertEqual($title, 'MECH 328 - Mechanical Engineering Design Project > Create Group Set'); // choose survey $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="event_select"] option[value="4"]')->click(); - + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { @@ -49,7 +43,7 @@ function($session) { return ($step->text() == 'Team Making - Step One'); } ); - + $surveyComp = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="frm"]/table/tbody/tr[2]/td')->text(); $this->assertEqual($surveyComp, '13 students were specified for this survey, 2 students responded'); // choose group configuration - chose to have 6 groups @@ -60,7 +54,7 @@ function($session) { $weights3[1]->click(); // 2nd question $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Next"]')->click(); } - + public function testStepTwo() { $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); @@ -72,7 +66,7 @@ public function testStepTwo() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'team_set_name')->sendKeys('Great Group'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Save Groups"]')->click(); } - + public function testEditGroups() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Team Creation Survey')->click(); @@ -94,7 +88,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Group set changed successfully.'); } - + public function testReleaseGroups() { $this->session->open($this->url.'surveygroups/release/'.$this->surveyGroupId); @@ -106,12 +100,12 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The group set was released successfully.'); - + $this->session->open($this->url.'groups/index/1'); $groups = count($this->session->elementsWithWait(PHPWebDriver_WebDriverBy::PARTIAL_LINK_TEXT, 'Great Group Team #')); $this->assertEqual($groups, 6); } - + public function testDeleteGroups() { $w = new PHPWebDriver_WebDriverWait($this->session); @@ -125,9 +119,9 @@ function($session) { } ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); - $this->assertEqual($msg, 'The group was deleted successfully.'); + $this->assertEqual($msg, 'The group was deleted successfully.'); } - + // delete the survey group set $this->session->open($this->url.'surveygroups/delete/'.$this->surveyGroupId); $w->until( @@ -136,6 +130,6 @@ function($session) { } ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); - $this->assertEqual($msg, 'The group set was deleted successfully.'); + $this->assertEqual($msg, 'The group set was deleted successfully.'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/enrol_student.test.php b/app/tests/cases/system/enrol_student.test.php index 7f755d661..720f3705d 100644 --- a/app/tests/cases/system/enrol_student.test.php +++ b/app/tests/cases/system/enrol_student.test.php @@ -2,34 +2,28 @@ require_once('system_base.php'); class EnrolStudentTestCase extends SystemBaseTestCase -{ +{ public function startCase() { - $this->getUrl(); echo "Start EnrolStudent system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testEnrolStudent() { $this->session->open($this->url.'users/add/2'); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'APSC 201 - Technical Communication > Add User'); - + // enter username: redshirt0004 $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserUsername')->sendKeys('redshirt0004'); // wait for "username already exist" warning @@ -39,24 +33,24 @@ function($session) { return $session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); } ); - + $warning = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); $this->assertEqual(substr($warning, 0, 39), 'Username "redshirt0004" already exists.'); - + // click here to enrol $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'here')->click(); - + // wait for the student to be enrolled $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); - $this->assertEqual($msg, 'User is successfully enrolled.'); + $this->assertEqual($msg, 'User is successfully enrolled.'); } - + public function testUnenrolStudent() { // unenrol Chris Student @@ -80,7 +74,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Student is successfully unenrolled!'); } - + public function testEnrolTutor() { $this->session->open($this->url.'users/add/1'); @@ -92,24 +86,24 @@ function($session) { return $session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); } ); - + $warning = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); $this->assertEqual(substr($warning, 0, 33), 'Username "tutor3" already exists.'); - + // click here to enrol $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'here')->click(); - + // wait for the student to be enrolled $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); - $this->assertEqual($msg, 'User is successfully enrolled.'); + $this->assertEqual($msg, 'User is successfully enrolled.'); } - + public function testUnenrolTutor() { // unenrol Tutor3 @@ -126,7 +120,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The course was updated successfully.'); } - + public function testAddingFromUsersIndex() { $this->session->open($this->url.'users/add'); @@ -138,16 +132,16 @@ function($session) { return $session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); } ); - + $warning = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); $this->assertEqual(substr($warning, 0, 39), 'Username "redshirt0003" already exists.'); - + $here = $this->session->elements(PHPWebDriver_WebDriverBy::LINK_TEXT, 'here'); $this->assertTrue(empty($here)); } - + public function testEnrollingNonStudent() - { + { $this->session->open($this->url.'users/add/1'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserUsername')->sendKeys('root'); $w = new PHPWebDriver_WebDriverWait($this->session); @@ -156,7 +150,7 @@ function($session) { return $session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); } ); - + $warning = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); $this->assertEqual(substr($warning, 0, 31), 'Username "root" already exists.'); // click here to enrol @@ -168,9 +162,9 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, "flashMessage")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, "flashMessage")->text(); - $this->assertEqual($msg, 'Error: You do not have permission to enrol this user.'); + $this->assertEqual($msg, 'Error: You do not have permission to enrol this user.'); } public function testEnrollingEnrolledStudent() @@ -183,19 +177,19 @@ function($session) { return $session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); } ); - + $warning = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); $this->assertEqual(substr($warning, 0, 39), 'Username "redshirt0001" already exists.'); // click here to enrol $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'here')->click(); - + // wait for the student to be enrolled $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, "flashMessage")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, "flashMessage")->text(); $this->assertEqual($msg, 'Error: The student is already enrolled.'); } @@ -210,20 +204,20 @@ function($session) { return $session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); } ); - + $warning = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); $this->assertEqual(substr($warning, 0, 33), 'Username "tutor1" already exists.'); // click here to enrol $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'here')->click(); - + // wait for the tutor to be enrolled $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, "flashMessage")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, "flashMessage")->text(); - $this->assertEqual($msg, 'Error: The student is already enrolled.'); + $this->assertEqual($msg, 'Error: The student is already enrolled.'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/home.test.php b/app/tests/cases/system/home.test.php index f6c8a1666..4824cbaf5 100644 --- a/app/tests/cases/system/home.test.php +++ b/app/tests/cases/system/home.test.php @@ -2,40 +2,34 @@ require_once('system_base.php'); class homeTestCase extends SystemBaseTestCase -{ +{ public function startCase() { - $this->getUrl(); echo "Start HomeTest system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testSuperAdmin() { $headers = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::TAG_NAME, 'h2'); $this->assertEqual($headers[0]->text(), 'My Courses'); $this->assertEqual($headers[1]->text(), 'Inactive Courses'); - + $courses = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::TAG_NAME, 'h3'); $this->assertEqual(count($courses), 3); $this->assertEqual($courses[0]->text(), 'APSC 201'); $this->assertEqual($courses[1]->text(), 'MECH 328'); $this->assertEqual($courses[2]->text(), 'CPSC 101'); - + // navigation $home = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Home'); $this->assertEqual(count($home), 1); @@ -48,7 +42,7 @@ public function testSuperAdmin() $admin = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Admin'); $this->assertEqual(count($admin), 1); } - + public function testAdmin() { $this->waitForLogoutLogin('admin2'); @@ -71,7 +65,7 @@ public function testAdmin() $admin = $this->session->elements(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Admin'); $this->assertEqual(count($admin), 0); } - + public function testInstructor() { $this->waitForLogoutLogin('instructor2'); @@ -94,14 +88,14 @@ public function testInstructor() $admin = $this->session->elements(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Admin'); $this->assertEqual(count($admin), 0); } - + public function testTutor() { $this->waitForLogoutLogin('tutor2'); $header = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::TAG_NAME, 'h2'); $this->assertEqual($header[0]->text(), 'Peer Evaluations'); $this->assertEqual($header[1]->text(), 'Surveys'); - + $titles = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::TAG_NAME, 'h3'); $this->assertEqual($titles[0]->text(), 'Due'); $this->assertEqual($titles[1]->text(), 'Submitted'); @@ -120,14 +114,14 @@ public function testTutor() $admin = $this->session->elements(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Admin'); $this->assertEqual(count($admin), 0); } - + public function testStudent() { $this->waitForLogoutLogin('redshirt0001'); $header = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::TAG_NAME, 'h2'); $this->assertEqual($header[0]->text(), 'Peer Evaluations'); $this->assertEqual($header[1]->text(), 'Surveys'); - + $titles = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::TAG_NAME, 'h3'); $this->assertEqual($titles[0]->text(), 'Due'); $this->assertEqual($titles[1]->text(), 'Submitted'); @@ -147,13 +141,13 @@ public function testStudent() $admin = $this->session->elements(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Admin'); $this->assertEqual(count($admin), 0); } - + public function studentTutorHome() { $header = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::TAG_NAME, 'h2'); $this->assertEqual($header[0]->text(), 'Peer Evaluations'); $this->assertEqual($header[1]->text(), 'Surveys'); - + $titles = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::TAG_NAME, 'h3'); $this->assertEqual($titles[0]->text(), 'Due'); $this->assertEqual($titles[1]->text(), 'Submitted'); @@ -161,4 +155,4 @@ public function studentTutorHome() $this->assertEqual($titles[3]->text(), 'Due'); $this->assertEqual($titles[4]->text(), 'Submitted'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/import_groups.test.php b/app/tests/cases/system/import_groups.test.php index e7cba9332..b10459c81 100644 --- a/app/tests/cases/system/import_groups.test.php +++ b/app/tests/cases/system/import_groups.test.php @@ -2,28 +2,22 @@ require_once('system_base.php'); class ImportGroupsTestCase extends SystemBaseTestCase -{ +{ public function startCase() { - $this->getUrl(); echo "Start ImportGroups system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('instructor2', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testImportGroupsError() { $this->session->open($this->url.'groups/import/2'); @@ -39,7 +33,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')->text(); $this->assertEqual($msg, "extension is not allowed.\nFileUpload::processFile() - Unable to save temp file to file system."); } - + public function testImportGroups() { $this->session->open($this->url.'groups/import/2'); @@ -54,18 +48,18 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[id='title']")->text(); $this->assertEqual($msg, 'The group CSV file was processed.'); - + $this->session->open($this->url.'courses/home/2'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'List Groups')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Team (3 members)')->click(); $groupId = end(explode('/', $this->session->url())); - + $this->session->open($this->url.'groups/edit/'.$groupId); $groupName = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'GroupGroupName')->attribute('value'); $this->assertEqual($groupName, 'Team'); $inGroup = count($this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="selected_groups"] option')); $this->assertEqual($inGroup, 3); - + $this->session->open($this->url.'groups/delete/'.$groupId); $w->until( function($session) { @@ -75,7 +69,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The group was deleted successfully.'); } - + public function testImportInvalidUsers() { $this->waitForLogoutLogin('instructor1'); @@ -93,7 +87,7 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[id='title']")->text(); $this->assertEqual($msg, 'The group CSV file was processed.'); - + $group = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="groupsimport"]/table[1]/tbody/tr[2]/td')->text(); $this->assertEqual($group, 'Team Supreme'); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="groupsimport"]/h2[2]')->text(); @@ -111,9 +105,9 @@ function($session) { $user = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="groupsimport"]/table[2]/tbody/tr[7]/td[1]')->text(); $this->assertEqual($user, 'redshirt9998'); $user = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="groupsimport"]/table[2]/tbody/tr[8]/td[1]')->text(); - $this->assertEqual($user, 'redshirt9999'); + $this->assertEqual($user, 'redshirt9999'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="OK"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Team Supreme (0 member)')->click(); $this->session->open(str_replace('view', 'delete', $this->session->url())); $w->until( @@ -124,7 +118,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The group was deleted successfully.'); } - + public function testImportWithStudentNo() { $this->session->open($this->url.'groups/import/1'); @@ -155,7 +149,7 @@ function($session) { $user = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="groupsimport"]/table[2]/tbody/tr[5]/td[1]')->text(); $this->assertEqual($user, '84188465'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="OK"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Best Team (4 members)')->click(); $this->session->open(str_replace('view', 'delete', $this->session->url())); $w->until( @@ -166,4 +160,4 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The group was deleted successfully.'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/import_users.test.php b/app/tests/cases/system/import_users.test.php index 3fa7c0847..f3225f93f 100644 --- a/app/tests/cases/system/import_users.test.php +++ b/app/tests/cases/system/import_users.test.php @@ -2,28 +2,22 @@ require_once('system_base.php'); class ImportUsersTestCase extends SystemBaseTestCase -{ +{ public function startCase() { - $this->getUrl(); echo "Start ImportUsers system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testImportUsersError() { $this->session->open($this->url.'users/import/2'); @@ -39,15 +33,15 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')->text(); $this->assertEqual($msg, "extension is not allowed.\nFileUpload::processFile() - Unable to save temp file to file system."); } - + public function testImportUsers() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Courses')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'APSC 201')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Import Students')->click(); - + $file = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserFile'); - $file->sendKeys(dirname(__FILE__).'/files/newClass_APSC201.csv'); + $file->sendKeys(dirname(__FILE__).'/files/newClass_APSC201.csv'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -57,12 +51,12 @@ function($session) { } ); $this->checkSummary(); - + // check class list - should have 17 students $this->session->open($this->url.'users/goToClassList/2'); $classSize = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[class="dataTables_info"]')->text(); $this->assertEqual($classSize, 'Showing 1 to 10 of 17 entries'); - + $search = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[aria-controls="table_id"]'); $search->sendKeys('New'); $w->until( @@ -74,7 +68,7 @@ function($session) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'td[class=" sorting_1"]')->click(); $newStudent = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'View')->attribute('href'); $userId = end(explode('/', $newStudent)); - + $this->updateClassList(); $this->session->open($this->url.'users/delete/'.$userId); $w->until( @@ -85,7 +79,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Record is successfully deleted!'); } - + public function updateClassList() { $this->session->open($this->url.'users/import/2'); @@ -99,16 +93,16 @@ public function updateClassList() $classSize = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[class="dataTables_info"]')->text(); $this->assertEqual($classSize, 'Showing 1 to 10 of 15 entries'); } - + public function checkSummary() { $h3 = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::TAG_NAME, 'h3'); $this->assertEqual($h3[0]->text(), 'User(s) created successfully:'); $this->assertEqual($h3[1]->text(), 'User(s) updated successfully:'); - + $user = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[1]/tbody/tr[2]/td[1]')->text(); $this->assertEqual($user, 'username11'); $user = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div/table[2]/tbody/tr[2]/td')->text(); $this->assertEqual($user, 'redshirt0001'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/login.test.php b/app/tests/cases/system/login.test.php index 70c361194..85e423b96 100644 --- a/app/tests/cases/system/login.test.php +++ b/app/tests/cases/system/login.test.php @@ -8,13 +8,8 @@ class LoginTestCase extends SystemBaseTestCase public function startCase() { - $this->getUrl(); echo "Start Login system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - //$this->session = $this->web_driver->session('ie', array('version' => '8')); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); + $this->getSession()->open($this->url); } public function endCase() diff --git a/app/tests/cases/system/mass_move.test.php b/app/tests/cases/system/mass_move.test.php index ccc19efd3..66be46aef 100644 --- a/app/tests/cases/system/mass_move.test.php +++ b/app/tests/cases/system/mass_move.test.php @@ -2,92 +2,86 @@ require_once('system_base.php'); class massMoveTestCase extends SystemBaseTestCase -{ +{ protected $courseId; protected $eventId; public function startCase() { - $this->getUrl(); echo "Start MassMove system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testImportUsers() { $this->courseId = $this->addCourse('TEST 101 101'); $this->session->open($this->url.'courses/import'); - + // check the submit button is disabled $submit = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit'); $this->assertTrue($submit->attribute('disabled')); - + $file = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'CourseFile'); $file->sendKeys(dirname(__FILE__).'/files/massMove.csv'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'CourseIdentifiersUsername')->click(); - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceCourses"] option[value="1"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option')) - 1; } ); - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option[value="4"]')->click(); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestCourses"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestCourses"] option')) - 1; } ); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestCourses"] option[value="'.$this->courseId.'"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'CourseAction0')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); - - + + // enrolling the instructor and tutor (csv) will fail $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Back to Course')); + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Back to Course')); } ); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'h3')->text(); $this->assertEqual($header, 'User(s) failed to transfer:'); - + // check that 7 students have been copied over to the new course $this->session->open($this->url.'users/goToClassList/'.$this->courseId); $classList = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'table_id_info')->text(); $this->assertEqual($classList, 'Showing 1 to 7 of 7 entries'); - + // check the event has been duplicated $this->session->open($this->url.'events/index/'.$this->courseId); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Team Creation Survey')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'TEST 101 101 - Demo Course > Team Creation Survey > View'); $this->eventId = end(explode('/', $this->session->url())); - + // check that the two submissions have been copied over $this->session->open($this->url.'evaluations/viewSurveySummary/'.$this->eventId); $submitted = count($this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Result')); $this->assertEqual($submitted, 2); } - + public function testMassMoveError() { @@ -95,19 +89,19 @@ public function testMassMoveError() $file = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'CourseFile'); $file->sendKeys(dirname(__FILE__).'/files/docx.docx'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'CourseIdentifiersUsername')->click(); - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceCourses"] option[value="1"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option')) - 1; } ); - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option[value="4"]')->click(); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestCourses"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestCourses"] option')) - 1; } ); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, @@ -123,7 +117,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')->text(); $this->assertEqual($msg, "extension is not allowed.\nFileUpload::processFile() - Unable to save temp file to file system."); } - + public function testImportByStudentNo() { $cId = $this->addCourse('TEST 201 101'); @@ -152,7 +146,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + //fill in survey for one student $this->waitForLogoutLogin('redshirt0003'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Test Survey')->click(); @@ -165,26 +159,26 @@ function($session) { } ); $this->waitForLogoutLogin('root'); - + $this->session->open($this->url.'courses/import'); $file = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'CourseFile'); $file->sendKeys(dirname(__FILE__).'/files/massMoveStudentNo.csv'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceCourses"] option[value="'.$this->courseId.'"]')->click(); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option')) - 1; } ); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option[value="'.$this->eventId.'"]')->click(); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestCourses"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestCourses"] option')) - 1; } ); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestCourses"] option[value="'.$cId.'"]')->click(); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestSurveys"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestSurveys"] option')) - 1; } ); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'CourseSurveyChoices0')->click(); //Existing Survey @@ -201,23 +195,23 @@ function($session) { $this->assertEqual($fail->text(), 'No student with student number 12345678 exists.'); $fail = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[1]/tbody/tr[3]/td[2]'); $this->assertEqual($fail->text(), 'No student with student number 87654321 exists.'); - + $success = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td[1]'); $this->assertEqual($success->text(), '65498451'); $success = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[3]/td[1]'); $this->assertEqual($success->text(), '65468188'); - + $success = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[4]/td[1]'); $this->assertEqual($success->text(), '98985481'); // successful, but survey responses will not be moved/copied because they have already submitted $success = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[4]/td[2]')->text(); $this->assertEqual(substr($success, 0, 46), 'Success. The student has already submitted to '); - + $success = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[5]/td[1]')->text(); $this->assertEqual($success, '84188465'); $success = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[5]/td[2]')->text(); $this->assertEqual($success, 'Success. However no student with student number 84188465 was enrolled in the source course.'); - + $success = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[6]/td[1]'); $this->assertEqual($success->text(), '48877031'); @@ -232,43 +226,43 @@ function($session) { $this->assertEqual($success->text(), '19524032'); $success = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[10]/td[1]'); $this->assertEqual($success->text(), '10186039'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Back to Course')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'List Students')->click(); $total = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'table_id_info')->text(); $this->assertEqual($total, 'Showing 1 to 9 of 9 entries'); - + $this->session->open($this->url.'courses/home/'.$cId); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'List Evaluation Events')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Results')->click(); $results = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Result'); $this->assertEqual(count($results), 2); - + $this->session->open($this->url.'courses/home/'.$this->courseId); $students = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="CourseHome"]/table/tbody/tr[2]/td[4]'); $this->assertEqual($students->text(), '0 students'); $events = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="CourseHome"]/table/tbody/tr[2]/td[6]'); $this->assertEqual($events->text(), '1 events'); - + $this->session->open($this->url.'courses/delete/'.$cId); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The course was deleted successfully.'); } - + public function testDeleteCourse() { $this->session->open($this->url.'courses/delete/'.$this->courseId); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The course was deleted successfully.'); } - + public function testBlankFile() { $this->courseId = $this->addCourse('DEMO 101 101'); $this->session->open($this->url.'courses/import'); $file = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'CourseFile'); $file->sendKeys(dirname(__FILE__).'/files/blank.csv'); - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "select[id='CourseSourceCourses'] option[value='".$this->courseId."']")->click(); // check that surveys fields are all disabled $w = new PHPWebDriver_WebDriverWait($this->session); @@ -300,7 +294,7 @@ function($session) { $students = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="CourseHome"]/table/tbody/tr[2]/td[4]'); $this->assertEqual($students->text(), '15 students'); } - + public function testWithoutSurvey() { $this->session->open($this->url.'courses/import'); @@ -338,7 +332,7 @@ function($session) { $note = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[4]/td[2]'); $this->assertEqual($note->text(), 'Success.'); } - + public function testDiffSuccessMsgs() { $this->session->open($this->url.'courses/import'); @@ -350,7 +344,7 @@ public function testDiffSuccessMsgs() $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option')) - 1; } ); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, @@ -375,14 +369,14 @@ function($session) { $this->assertEqual($user->text(),'redshirt0005'); $note = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[4]/td[2]'); $this->assertEqual($note->text(), 'Success. However no student with username redshirt0005 was enrolled in the source course.'); - + $this->enrolStudent(1, 'redshirt0001'); // re-enrol redshirt0001 $this->assignToGroup(); $this->session->open($this->url.'courses/delete/'.$this->courseId); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The course was deleted successfully.'); } - + public function addCourse($name) { $this->session->open($this->url.'courses/add'); @@ -396,10 +390,10 @@ function($session) { } ); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, $name)->click(); - + return end(explode('/', $this->session->url())); } - + public function enrolStudent($cId, $username) { // enrol a student to test that an already enrolled student will still be imported "successfully" @@ -412,20 +406,20 @@ function($session) { return $session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); } ); - + $warning = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); $this->assertEqual(substr($warning, 0, 39), 'Username "'.$username.'" already exists.'); - + // click here to enrol $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'here')->click(); - + // wait for the student to be enrolled $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'User is successfully enrolled.'); } @@ -443,4 +437,4 @@ function($session) { } ); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/merge_users.test.php b/app/tests/cases/system/merge_users.test.php index cd1d4e991..1ccfaa010 100644 --- a/app/tests/cases/system/merge_users.test.php +++ b/app/tests/cases/system/merge_users.test.php @@ -2,33 +2,27 @@ require_once('system_base.php'); class MergeUsersTestCase extends SystemBaseTestCase -{ +{ public function startCase() { - $this->getUrl(); echo "Start MergeUsers system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testAddUsers() { $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Home'); - + $user1 = array( 'UserUsername' => 'bobby1234', 'UserFirstName' => 'Bob', @@ -37,7 +31,7 @@ public function testAddUsers() 'UserStudentNo' => '15123578', ); $course1 = array('CoursesId2'); - + $user2 = array( 'UserUsername' => 'bobby5678', 'UserFirstName' => 'Rob', @@ -46,32 +40,32 @@ public function testAddUsers() 'UserStudentNo' => '15123578', ); $course2 = array('CoursesId1', 'CoursesId2'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Users')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Users'); - + $this->addUser($user1, $course1); $this->addUser($user2, $course2); } - + public function addUser($user, $courses) - { + { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add User')->click(); $heading = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'h1.title')->text(); $this->assertEqual($heading, 'Add User'); - + foreach ($user as $id => $txt) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, $id)->sendKeys($txt); } - + foreach ($courses as $course) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, $course)->click(); } - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, 'data[Form][save]')->click(); } - + public function testMergeUsers() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Users')->click(); @@ -80,7 +74,7 @@ public function testMergeUsers() { $this->assertEqual($heading, 'Merge Users'); $return = new PHPWebDriver_WebDriverKeys('ReturnKey'); - + $merge = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'merge'); $this->assertTrue($merge->attribute('disabled')); $prmy = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserPrimaryAccount'); @@ -91,7 +85,7 @@ public function testMergeUsers() { $primary = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserPrimarySearchValue'); $primary->sendKeys('Bob B'); $primary->sendKeys($return->key); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserSecondarySearch"] option[value="username"]')->click(); $secondary = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserSecondarySearchValue'); $secondary->sendKeys('bby567'); @@ -108,7 +102,7 @@ function($session) { $this->assertEqual($primaryUser[0]->text(), '-- Pick the primary account --'); $this->assertEqual($primaryUser[1]->text(), 'Bob Black'); $primaryId = $primaryUser[1]->attribute('value'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserPrimaryAccount"] option[value="'.$primaryId.'"]')->click(); // wait for secondary account search results @@ -121,33 +115,33 @@ function($session) { $this->assertEqual($secondaryUser[0]->text(), '-- Pick the secondary account --'); $this->assertEqual($secondaryUser[1]->text(), 'bobby5678'); $secondaryId = $secondaryUser[1]->attribute('value'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserSecondaryAccount"] option[value="'.$secondaryId.'"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); - + $this->session->accept_alert(); - + // wait for merger to finish $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); - $this->assertEqual($msg, 'The two accounts have successfully merged.'); - + $this->assertEqual($msg, 'The two accounts have successfully merged.'); + $this->session->open($this->url.'users/delete/'.$primaryId); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); - $this->assertEqual($msg, 'Record is successfully deleted!'); + $this->assertEqual($msg, 'Record is successfully deleted!'); } - + public function testUnMatchingRoles() { $this->session->open($this->url.'users/merge'); $return = new PHPWebDriver_WebDriverKeys('ReturnKey'); - + $primary = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserPrimarySearchValue'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserPrimarySearch"] option[value="username"]')->click(); $primary->sendKeys('root'); @@ -169,7 +163,7 @@ function($session) { $this->assertEqual($primaryUser[0]->text(), '-- Pick the primary account --'); $this->assertEqual($primaryUser[1]->text(), 'root'); $primaryUser[1]->click(); - + // wait for secondary account search results $w->until( function($session) { @@ -183,18 +177,18 @@ function($session) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $this->session->accept_alert(); - + // wait for merger to finish $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, "flashMessage")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, "flashMessage")->text(); - $this->assertEqual($msg, 'Error: The users do not have the same role.'); + $this->assertEqual($msg, 'Error: The users do not have the same role.'); } - + public function testNoUsersFound() { $primary = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserPrimarySearchValue'); @@ -202,7 +196,7 @@ public function testNoUsersFound() $primary->sendKeys('redshirt9999'); $return = new PHPWebDriver_WebDriverKeys('ReturnKey'); $primary->sendKeys($return->key); - + // wait for primary account search results $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -211,96 +205,96 @@ function($session) { return ($option->text() == '-- No users found --'); } ); - + $prmy = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserPrimaryAccount'); $this->assertTrue($prmy->attribute('disabled')); } - + public function testMergeLoggedInUser() { $this->waitForLogoutLogin('admin1'); $this->session->open($this->url.'users/merge'); $return = new PHPWebDriver_WebDriverKeys('ReturnKey'); - + $primary = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserPrimarySearchValue'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserPrimarySearch"] option[value="username"]')->click(); $primary->sendKeys('admin'); $primary->sendkeys($return->key); - + $secondary = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserSecondarySearchValue'); $secondary->sendKeys('admin'); $secondary->sendKeys($return->key); - + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserPrimaryAccount"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserPrimaryAccount"] option')) - 1; } ); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserSecondaryAccount"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserSecondaryAccount"] option')) - 1; } ); - + $primaryUser = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserPrimaryAccount"] option'); $this->assertEqual($primaryUser[0]->text(), '-- Pick the primary account --'); $this->assertEqual($primaryUser[1]->text(), 'admin1'); $this->assertEqual($primaryUser[2]->text(), 'admin2'); - + $secondaryUser = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserSecondaryAccount"] option'); $this->assertEqual($secondaryUser[0]->text(), '-- Pick the secondary account --'); $this->assertEqual($secondaryUser[1]->text(), 'admin1'); $this->assertEqual($secondaryUser[2]->text(), 'admin2'); - + $primaryUser[2]->click(); $secondaryUser[1]->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $this->session->accept_alert(); - + $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')); + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')); } ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage'); $this->assertEqual($msg->text(), 'Error: The secondary account is the currently logged in user.'); } - + public function testMergeSameUsers() { $return = new PHPWebDriver_WebDriverKeys('ReturnKey'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserPrimarySearchValue')->sendKeys($return->key); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserSecondarySearchValue')->sendKeys($return->key); - + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserPrimaryAccount"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserPrimaryAccount"] option')) - 1; } ); $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserSecondaryAccount"] option')) - 1; + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserSecondaryAccount"] option')) - 1; } ); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserPrimaryAccount"] option[value="38"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="UserSecondaryAccount"] option[value="38"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $this->session->accept_alert(); - + $w->until( function($session) { - return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')); + return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')); } ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage'); $this->assertEqual($msg->text(), 'Error: No merger needed. The primary and secondary accounts are the same.'); } - + public function testAccessibleRoles() { $primary = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserPrimarySearchValue'); @@ -308,7 +302,7 @@ public function testAccessibleRoles() $primary->sendKeys('root'); $return = new PHPWebDriver_WebDriverKeys('ReturnKey'); $primary->sendKeys($return->key); - + // wait for primary account search results // will not find root (super admin) because it is not an accessible role for admins $w = new PHPWebDriver_WebDriverWait($this->session); @@ -318,8 +312,8 @@ function($session) { return ($option->text() == '-- No users found --'); } ); - + $prmy = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'UserPrimaryAccount'); $this->assertTrue($prmy->attribute('disabled')); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/move_student.test.php b/app/tests/cases/system/move_student.test.php index 707be360b..f24d09666 100644 --- a/app/tests/cases/system/move_student.test.php +++ b/app/tests/cases/system/move_student.test.php @@ -4,55 +4,49 @@ class MoveStudentTestCase extends SystemBaseTestCase { protected $courseId; - + public function startCase() { - $this->getUrl(); echo "Start MoveStudent system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('admin1', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testAddSurveyEvent() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Courses')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Courses'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'APSC 201')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'APSC 201 - Technical Communication'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Event')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'APSC 201 - Technical Communication > Add Event'); - + $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventTitle'); $title->sendKeys('Group Making Survey'); - + $desc = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDescription'); $desc->sendKeys('This survey is for creating groups.'); - - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, + + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEventTemplateTypeId"] option[value="3"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDueDate')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventReleaseDateBegin')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventReleaseDateEnd')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -61,16 +55,16 @@ function($session) { } ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); - $this->assertEqual($msg, 'Add event successful!'); + $this->assertEqual($msg, 'Add event successful!'); } - + public function testCopyStudent() { $this->session->open($this->url.'courses/move'); - + $submit = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit'); $this->assertTrue($submit->attribute('disabled')); - + $sourceCourse = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceCourses"] option[value="1"]'); $sourceCourse->click(); $this->assertEqual($sourceCourse->text(), 'MECH 328 - Mechanical Engineering Design Project'); @@ -81,7 +75,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option')) - 1; } ); - + $sourceSurvey = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceSurveys"] option[value="4"]'); $sourceSurvey->click(); $this->assertEqual($sourceSurvey->text(), 'Team Creation Survey'); @@ -90,7 +84,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSubmitters"] option')) - 1; } ); - + $submitter = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSubmitters"] option[value="31"]'); $submitter->click(); $this->assertEqual($submitter->text(), 'Hui Student'); @@ -99,7 +93,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestCourses"] option')) - 1; } ); - + $destCourse = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestCourses"] option'); $this->assertEqual($destCourse[0]->text(), '-- Pick a course --'); $this->assertEqual($destCourse[1]->text(), 'APSC 201 - Technical Communication'); @@ -109,16 +103,16 @@ function($session) { function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestSurveys"] option')) - 1; } - ); + ); $destSurvey = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestSurveys"] option'); $this->assertEqual($destSurvey[0]->text(), '-- Pick a survey --'); $this->assertEqual($destSurvey[1]->text(), 'Group Making Survey'); $eventId = $destSurvey[1]->attribute('value'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseDestSurveys"] option[value="'.$eventId.'"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'CourseAction0')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $w->until( function($session) { @@ -127,10 +121,10 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Hui Student was successfully copied to APSC 201 - Technical Communication.'); - + $this->deleteEvent($eventId); } - + public function testMoveStudent() { $this->edgeCasesSetup(); @@ -145,7 +139,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Chris Student was successfully moved to EECE 375 101 - Project Course.'); } - + public function testAlreadySubmitted() { $this->session->open($this->url.'courses/move'); @@ -178,7 +172,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Student is successfully unenrolled!'); } - + public function testAlreadyEnrolled() { $this->session->open($this->url.'courses/move'); @@ -191,13 +185,13 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Travis Student was successfully moved to EECE 375 101 - Project Course.'); - + $this->session->open($this->url.'users/goToClassList/1'); $total = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'table_id_info')->text(); $this->assertEqual($total, 'Showing 1 to 10 of 13 entries'); $this->session->open($this->url.'courses/delete/'.$this->courseId); } - + public function deleteEvent($eventId) { $this->session->open($this->url.'evaluations/viewSurveySummary/'.$eventId); @@ -206,7 +200,7 @@ public function deleteEvent($eventId) $this->session->open($result->attribute('href')); // instead of trying to go to the new window or tab $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'APSC 201 - Technical Communication > Group Making Survey > Results'); - + // unenrol Hui Student $this->session->open($this->url.'users/goToClassList/2'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[aria-controls="table_id"]')->sendKeys('Hui'); @@ -227,7 +221,7 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Student is successfully unenrolled!'); - + // delete Group Making Survey Event $this->session->open($this->url.'events/delete/'.$eventId); $w->until( @@ -238,7 +232,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The event has been deleted successfully.'); } - + public function enrolStudent($username, $courseId) { $this->session->open($this->url.'users/add/'.$courseId); @@ -250,10 +244,10 @@ function($session) { return $session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); } ); - + $warning = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'div[id="usernameErr"]')->text(); $this->assertEqual(substr($warning, 0, 39), 'Username "'.$username.'" already exists.'); - + // click here to enrol $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'here')->click(); // wait for the student to be enrolled @@ -262,24 +256,24 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'User is successfully enrolled.'); } - + public function edgeCasesSetup() { $this->enrolStudent('redshirt0004', '1'); $this->enrolStudent('redshirt0005', '1'); $this->enrolStudent('redshirt0006', '1'); - + $this->waitForLogoutLogin('redshirt0004'); $this->fillInSurvey('1', '5', 'Team Creation Survey'); $this->waitForLogoutLogin('redshirt0005'); $this->fillInSurvey('1', '6', 'Team Creation Survey'); $this->waitForLogoutLogin('redshirt0006'); $this->fillInSurvey('2', '5', 'Team Creation Survey'); - + $this->waitForLogoutLogin('root'); $this->session->open($this->url.'courses/add'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'CourseCourse')->sendKeys('EECE 375 101'); @@ -291,7 +285,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'EECE 375 101')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Event')->click(); $this->courseId = end(explode('/', $this->session->url())); @@ -309,12 +303,12 @@ function($session) { $this->enrolStudent('redshirt0005', $this->courseId); $this->enrolStudent('redshirt0006', $this->courseId); - + $this->waitForLogoutLogin('redshirt0005'); $this->fillInSurvey('1', '5', 'Test Survey'); $this->waitForLogoutLogin('root'); } - + public function fillInSurvey($first, $snd, $survey) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, $survey)->click(); @@ -328,7 +322,7 @@ function($session) { } ); } - + public function moveStudent($userId) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="CourseSourceCourses"] option[value="1"]')->click(); @@ -360,4 +354,4 @@ function($session) { $surveys[1]->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit')->click(); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/oauth_client.test.php b/app/tests/cases/system/oauth_client.test.php index 4c901122e..750153fa4 100644 --- a/app/tests/cases/system/oauth_client.test.php +++ b/app/tests/cases/system/oauth_client.test.php @@ -4,46 +4,40 @@ class oauthClientTestCase extends SystemBaseTestCase { protected $clientId = 0; - + public function startCase() { - $this->getUrl(); echo "Start OauthClient system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testAddOauthClient() { $this->session->open($this->url.'pages/admin'); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Admin'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'OAuth Client Credentials')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Client')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Create New OAuth Client Credential'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'OauthClientComment')->sendKeys('For Testing'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'A new OAuth client has been created'); - $this->assertEqual($this->session->url(), $this->url.'oauthclients'); + $this->assertEqual($this->session->url(), $this->url.'oauthclients'); } - + public function testEditOauthClient() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[aria-controls="table_id"]')->sendKeys('For Testing'); @@ -56,37 +50,37 @@ function($session) { ); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'td[class=" sorting_1"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Edit')->click(); - + $this->clientId = end(explode('/', $this->session->url())); - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'OauthClientComment')->sendKeys('Has been edited'); + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'OauthClientComment')->sendKeys('Has been edited'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The OAuth client has been saved'); - $this->assertEqual($this->session->url(), $this->url.'oauthclients'); + $this->assertEqual($this->session->url(), $this->url.'oauthclients'); } - + public function testEditProfile() { $this->session->open($this->url.'users/editProfile'); $id = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="'.$this->clientId.'"]')->attribute('id'); $selectId = str_replace('Id','Enabled',$id); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="'.$selectId.'"] option[value="0"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your Profile Has Been Updated Successfully.'); $label = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="'.$selectId.'"] option[value="0"]')->text(); $this->assertEqual($label, 'Disabled'); } - + public function testDelete() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[href="/oauthclients/delete/'.$this->clientId.'"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'OAuth client deleted'); } - + public function testAddOauthClientOtherUser() { $this->session->open($this->url.'oauthclients/add'); @@ -94,13 +88,13 @@ public function testAddOauthClientOtherUser() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'A new OAuth client has been created'); - + $this->waitForLogoutLogin('instructor3'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Instructor 3')->click(); // instructors will not be able to see the Oauth section of their profile $oauth = $this->session->elements(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Client Credential'); $this->assertTrue(empty($oauth)); - + $this->waitForLogoutLogin('root'); $this->session->open($this->url.'oauthclients'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[aria-controls="table_id"]')->sendKeys('instructor3'); @@ -116,4 +110,4 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'OAuth client deleted'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/oauth_token.test.php b/app/tests/cases/system/oauth_token.test.php index f449ebbfd..898ffe16c 100644 --- a/app/tests/cases/system/oauth_token.test.php +++ b/app/tests/cases/system/oauth_token.test.php @@ -4,47 +4,41 @@ class oauthTokenTestCase extends SystemBaseTestCase { protected $tokenId = 0; - + public function startCase() { - $this->getUrl(); echo "Start OauthToken system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testAddOauthToken() { $this->session->open($this->url.'pages/admin'); $title = $this->session->elementWithWait(PHPWebDRiver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Admin'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'OAuth Token Credentials')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Token')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Create New OAuth Token Credential'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="OauthTokenExpiresYear"] option[value="2018"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'OauthTokenComment')->sendKeys('For Testing'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'New OAuth token created!'); - $this->assertEqual($this->session->url(), $this->url.'oauthtokens'); + $this->assertEqual($this->session->url(), $this->url.'oauthtokens'); } - + public function testEditOauthToken() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[aria-controls="table_id"]')->sendKeys('For Testing'); @@ -57,36 +51,36 @@ function($session) { ); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'td[class=" sorting_1"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Edit')->click(); - + $this->tokenId = end(explode('/', $this->session->url())); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="OauthTokenExpiresYear"] option[value="2023"]')->click(); - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'OauthTokenComment')->sendKeys('Has been edited'); + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'OauthTokenComment')->sendKeys('Has been edited'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'OAuth token saved successfully!'); - $this->assertEqual($this->session->url(), $this->url.'oauthtokens'); + $this->assertEqual($this->session->url(), $this->url.'oauthtokens'); } - + public function testEditProfile() { $this->session->open($this->url.'users/editProfile'); $id = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="'.$this->tokenId.'"]')->attribute('id'); $selectId = str_replace('Id','Enabled',$id); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="'.$selectId.'"] option[value="0"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your Profile Has Been Updated Successfully.'); $label = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="'.$selectId.'"] option[value="0"]')->text(); $this->assertEqual($label, 'Disabled'); } - + public function testDelete() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[href="/oauthtokens/delete/'.$this->tokenId.'"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); - $this->assertEqual($msg, 'OAuth token deleted.'); + $this->assertEqual($msg, 'OAuth token deleted.'); } public function testAddOauthClientOtherUser() @@ -96,13 +90,13 @@ public function testAddOauthClientOtherUser() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit"]')->click(); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'New OAuth token created!'); - + $this->waitForLogoutLogin('instructor3'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Instructor 3')->click(); // instructors will not be able to see the Oauth section of their profile $oauth = $this->session->elements(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Token Credential'); $this->assertTrue(empty($oauth)); - + $this->waitForLogoutLogin('root'); $this->session->open($this->url.'oauthtokens'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[aria-controls="table_id"]')->sendKeys('instructor3'); @@ -118,4 +112,4 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'OAuth token deleted.'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/permissions_editor.test.php b/app/tests/cases/system/permissions_editor.test.php index 7d18518ea..0118db6ac 100644 --- a/app/tests/cases/system/permissions_editor.test.php +++ b/app/tests/cases/system/permissions_editor.test.php @@ -2,66 +2,60 @@ require_once('system_base.php'); class PermissionsEditorTestCase extends SystemBaseTestCase -{ +{ public function startCase() { - $this->getUrl(); echo "Start PermissionsEditor system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testAllowAccess() { // access permission editor $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Home'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Admin')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Admin'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Permissions Editor')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Permissions Editor > superadmin'); - + // change the role from super admin to instructor $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="role"] option[value="3"]')->click(); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Permissions Editor > instructor'); - + // search for functions/user/index $this->findPermissions('controllers/accesses/view'); - + // allow access $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Allow All')->click(); $this->updatePermissions(); } - + public function testAccess() { $this->waitForLogoutLogin('instructor1'); - + $this->session->open($this->url.'accesses/view/5'); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'Permissions Editor > student'); - + $this->waitForLogoutLogin('root'); } - + public function testDenyAccess() { $this->session->open($this->url.'accesses/view/3'); @@ -70,16 +64,16 @@ public function testDenyAccess() // search for functions/user/index $this->findPermissions('controllers/accesses/view'); - + // deny access $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Deny All')->click(); $this->updatePermissions(); } - + public function testDenyIndividualActions() { $this->session->open($this->url.'accesses/view/3'); - + // deny create $this->findPermissions('controllers/mixevals/index'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Deny Create')->click(); @@ -108,7 +102,7 @@ public function testDenyIndividualActions() $this->assertTrue(!empty($allow)); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Deny Delete')->click(); $this->updatePermissions(); - + $this->waitForLogoutLogin('instructor1'); $this->session->open($this->url.'evaltools'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluations')->click(); @@ -122,11 +116,11 @@ function($session) { $this->assertEqual($msg->text(), 'Error: You do not have permission to access the page.'); $this->waitForLogoutLogin('root'); } - + public function testAllowIndividualActions() { $this->session->open($this->url.'accesses/view/3'); - + // allow create $this->findPermissions('controllers/mixevals/index'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Allow Create')->click(); @@ -155,19 +149,19 @@ public function testAllowIndividualActions() $this->assertTrue(empty($allow)); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Allow Delete')->click(); $this->updatePermissions(); - + $this->waitForLogoutLogin('instructor1'); $this->session->open($this->url.'evaltools'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluations')->click(); $this->assertEqual($this->session->url(), $this->url.'mixevals'); } - + public function findPermissions($permission) { // search for the permission to access users/index $search = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[aria-controls="table_id"]'); $search->sendKeys($permission); - + // open the table row for options $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( @@ -176,10 +170,10 @@ function($session) { return ($count == 1); } ); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'td[class=" sorting_1"]')->click(); } - + public function updatePermissions() { $this->session->accept_alert(); @@ -192,4 +186,4 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Permissions have been updated'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/student_mixeval.test.php b/app/tests/cases/system/student_mixeval.test.php index 7baa6a48a..bfedf514a 100644 --- a/app/tests/cases/system/student_mixeval.test.php +++ b/app/tests/cases/system/student_mixeval.test.php @@ -5,28 +5,22 @@ class studentMixeval extends SystemBaseTestCase { protected $eventId = 0; protected $templateId = 0; - + public function startCase() { - $this->getUrl(); echo "Start StudentMixeval system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testCreateEvent() { $this->session->open($this->url.'events/add/1'); @@ -47,11 +41,11 @@ public function testCreateEvent() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateEnd')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[title="Next"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, '28')->click(); - + // add penalty $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Penalty')->click();; $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="Penalty0PercentPenalty"] option[value="10"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="GroupGroup"] option[value="1"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="GroupGroup"] option[value="2"]')->click(); @@ -65,17 +59,17 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Add event successful!'); } - + public function testStudent() { $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); - + // check penalty note $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Show/Hide Late Penalty Policy')->click(); $penalty = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'penalty')->text(); $this->assertEqual($penalty, "1 day late: 10% deduction.\n10% is deducted afterwards."); - + // help text $help = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table/tbody/tr/td/form/div[2]/p'); $this->assertEqual($help->text(), 'Please rate performance.'); @@ -89,7 +83,7 @@ public function testStudent() $help = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table/tbody/tr/td/form/div[12]/p'); $this->assertEqual($help->text(), 'Please give a paragraph answer.'); $this->assertEqual($help->attribute('class'), 'help green'); - + // required questions $star = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'span[class="required orangered floatright"]'); $this->assertEqual(count($star), 10); @@ -103,7 +97,7 @@ public function testStudent() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '66EvaluationMixeval4QuestionComment')->sendKeys('absolutely'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, 'data[6][EvaluationMixeval][5][question_comment]')->sendKeys('definitely'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '66EvaluationMixeval6QuestionComment')->sendKeys('very easy'); - + // Matt Student's evaluation // Likert questions $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table/tbody/tr/td/form/div[8]/table/tbody/tr[2]/td[5]/input')->click(); @@ -112,7 +106,7 @@ public function testStudent() // short and long answers $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '77EvaluationMixeval4QuestionComment')->sendKeys('absolutely'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '77EvaluationMixeval6QuestionComment')->sendKeys('very easy'); - + // submit $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); @@ -123,7 +117,7 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, "flashMessage")->text(); $this->assertEqual($msg, 'Your answers have been saved. Please answer all the required questions before it can be considered submitted.'); - + // answer the required question that was left unanswered $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, 'data[7][EvaluationMixeval][5][question_comment]')->sendKeys('definitely'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit')->click(); @@ -135,7 +129,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your Evaluation was submitted successfully.'); } - + public function testReSubmit() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); @@ -161,12 +155,12 @@ function($session) { $this->secondStudent(); $this->tutor(); } - + public function testBasicResult() { $this->waitForLogoutLogin('root'); $this->removeFromGroup(); - + $this->session->open($this->url.'events/index/1'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $this->eventId = end(explode('/', $this->session->url())); @@ -179,7 +173,7 @@ public function testBasicResult() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateBegin')->clear(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateBegin')->sendKeys(date('Y-m-d H:i:s')); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit"]')->click(); - $w = new PHPWebDriver_WebDriverWait($this->session); + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); @@ -204,7 +198,7 @@ function($session) { $this->assertEqual($matt->text(), '(not submitted)'); $matt = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[4]/td[4]'); $this->assertEqual($matt->text(), '---'); - + // view summary table $this->session->open($this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/1'); $notSubmit = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[1]/th')->text(); @@ -215,7 +209,7 @@ function($session) { $this->assertEqual($left, 'Left the group, but had submitted or were evaluated'); $left = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[3]/tbody/tr[2]/td')->text(); $this->assertEqual($left, 'Tutor 1 (TA)'); - + $total = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]/tbody/tr[1]/th[2]')->text(); $this->assertEqual($total, 'Total:( /3.00)'); $ed = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]/tbody/tr[2]/td[2]')->text(); @@ -227,15 +221,15 @@ function($session) { $avg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]/tbody/tr[5]/td[2]')->text(); $this->assertEqual($avg, '2.12'); } - + public function testDetailResult() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Detail')->click(); - + // auto-release results messages $msg = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'autoRelease_msg'); $this->assertTrue(!empty($msg)); - + // view summary table $notSubmit = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[2]/tbody/tr[1]/th')->text(); $this->assertEqual($notSubmit, 'Have not submitted their evaluations'); @@ -245,7 +239,7 @@ public function testDetailResult() $this->assertEqual($left, 'Left the group, but had submitted or were evaluated'); $left = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[3]/tbody/tr[2]/td')->text(); $this->assertEqual($left, 'Tutor 1 (TA)'); - + $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[1]/th[2]')->text(); $this->assertEqual($header, '1 (/1.0)'); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[1]/th[3]')->text(); @@ -254,7 +248,7 @@ public function testDetailResult() $this->assertEqual($header, '3 (/1.0)'); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[1]/th[5]')->text(); $this->assertEqual($header, 'Total (/3.00)'); - + $ed = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[2]/td[2]')->text(); $this->assertEqual($ed, '0.90'); $ed = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[2]/td[3]')->text(); @@ -263,7 +257,7 @@ public function testDetailResult() $this->assertEqual($ed, '0.90'); $ed = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[2]/td[5]')->text(); $this->assertEqual($ed, '2.80 - 0.28 = 2.52 (84.00%)'); - + $alex = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[3]/td[2]')->text(); $this->assertEqual($alex, '0.80'); $alex = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[3]/td[3]')->text(); @@ -291,27 +285,27 @@ public function testDetailResult() $avg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[5]/td[5]')->text(); $this->assertEqual($avg, '2.12'); } - + public function testIndivDetailResults() { $final = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panel1Content"]/b')->text(); $this->assertEqual($final, 'Final Total: 2.80 - 0.28 = 2.52 (84%) << Above Group Average >>'); $penalty = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panel1Content"]/font')->text(); $this->assertEqual($penalty, '10%'); - + $required = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'span[class="required orangered"]'); $this->assertEqual(count($required), 15); $unEnrolled = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'label[class="blue"]'); $this->assertEqual(count($unEnrolled), 17); $this->assertEqual($unEnrolled[0]->text(), 'Tutor 1:'); - + $likerts = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[checked="checked"]'); - + $this->assertTrue($likerts[0]->attribute('disabled')); $this->assertEqual($likerts[0]->attribute('value'), 3); $ques1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[1]/div[1]/li/label[7]'); $this->assertEqual($ques1->text(), 'Grade: 0.80 / 1'); - + $this->assertTrue($likerts[1]->attribute('disabled')); $this->assertTrue($likerts[1]->attribute('value'), 4); $ques2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[1]/div[2]/li/label[7]'); @@ -332,19 +326,19 @@ public function testIndivDetailResults() $this->assertEqual($ques4->text(), 'Grade: 1.00 / 1'); $ques4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[2]/div[2]/li/label[8]'); $this->assertEqual($ques4->text(), '(Highest)'); - + $this->assertTrue($likerts[4]->attribute('disabled')); $this->assertEqual($likerts[4]->attribute('value'), 3); $ques5 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[3]/div[1]/li/label[7]'); $this->assertEqual($ques5->text(), 'Grade: 0.80 / 1'); - + $this->assertTrue($likerts[5]->attribute('disabled')); $this->assertTrue($likerts[5]->attribute('value'), 4); $ques6 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[3]/div[2]/li/label[7]'); $this->assertEqual($ques6->text(), 'Grade: 1.00 / 1'); $ques6 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[3]/div[2]/li/label[8]'); $this->assertEqual($ques6->text(), '(Highest)'); - + $comm1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[4]/li[1]')->text(); $this->assertEqual(substr($comm1, -3), 'cat'); $comm2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[4]/li[2]')->text(); @@ -358,7 +352,7 @@ public function testIndivDetailResults() $comm6 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[6]/li[2]')->text(); $this->assertEqual(substr($comm6, -5), 'green'); } - + public function testStudentResults() { $this->waitForLogoutLogin('redshirt0001'); @@ -368,12 +362,12 @@ public function testStudentResults() $required = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'span[class="required orangered"]'); $this->assertEqual(count($required), 5); - + $likerts = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[checked="checked"]'); $testShuffle = $this->shuffled($likerts->attribute('value')); $this->assertTrue($testShuffle); } - + public function shuffled($mark) { $likerts = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[checked="checked"]'); @@ -388,7 +382,7 @@ public function shuffled($mark) $this->assertEqual($likerts[0]->attribute('value'), 3); $ques1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[1]/div[1]/li/label[6]'); $this->assertEqual($ques1->text(), 'Grade: 0.80 / 1'); - + $this->assertTrue($likerts[1]->attribute('value'), 4); $ques2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[1]/div[2]/li/label[6]'); $this->assertEqual($ques2->text(), 'Grade: 1.00 / 1'); @@ -406,17 +400,17 @@ public function shuffled($mark) $this->assertEqual($ques4->text(), 'Grade: 1.00 / 1'); $ques4 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[2]/div[2]/li/label[7]'); $this->assertEqual($ques4->text(), '(Highest)'); - + $this->assertEqual($likerts[4]->attribute('value'), 3); $ques5 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[3]/div[1]/li/label[6]'); $this->assertEqual($ques5->text(), 'Grade: 0.80 / 1'); - + $this->assertTrue($likerts[5]->attribute('value'), 4); $ques6 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[3]/div[2]/li/label[6]'); $this->assertEqual($ques6->text(), 'Grade: 1.00 / 1'); $ques6 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[3]/div[2]/li/label[7]'); $this->assertEqual($ques6->text(), '(Highest)'); - + $comm1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[4]/li[1]')->text(); $this->assertEqual($comm1, 'cat'); $comm2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[4]/li[2]')->text(); @@ -440,7 +434,7 @@ public function shuffled($mark) $this->assertEqual($likerts[1]->attribute('value'), 3); $ques2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[1]/div[2]/li/label[6]'); $this->assertEqual($ques2->text(), 'Grade: 0.80 / 1'); - + $this->assertTrue($likerts[2]->attribute('value'), 4); $ques3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[2]/div[1]/li/label[6]'); $this->assertEqual($ques3->text(), 'Grade: 1.00 / 1'); @@ -458,7 +452,7 @@ public function shuffled($mark) $this->assertEqual($ques5->text(), 'Grade: 1.00 / 1'); $ques5 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[3]/div[1]/li/label[7]'); $this->assertEqual($ques5->text(), '(Highest)'); - + $this->assertEqual($likerts[5]->attribute('value'), 3); $ques6 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[3]/div[2]/li/label[6]'); $this->assertEqual($ques6->text(), 'Grade: 0.80 / 1'); @@ -480,7 +474,7 @@ public function shuffled($mark) return false; } } - + public function testBasic() { $this->waitForLogoutLogin('root'); @@ -493,7 +487,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td'); @@ -510,11 +504,11 @@ function($session) { $this->assertEqual($ques3, '3. Submitted work on time *'); $avg3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[3]/li')->text(); $this->assertEqual($avg3, 'Average: 0.90 / 1'); - + $required = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'span[class="required orangered"]'); $this->assertEqual(count($required), 3); } - + public function testNotReleased() { $this->waitForLogoutLogin('root'); @@ -528,7 +522,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td'); @@ -548,7 +542,7 @@ function($session) { $ques6 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[6]/li'); $this->assertEqual($ques6->text(), 'Comments Not Released Yet'); } - + public function testReviewed() { $this->waitForLogoutLogin('root'); @@ -565,7 +559,7 @@ function($session) { $review = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="ajaxListDiv"]/div/table/tbody/tr[2]/td[6]/div')->text(); $this->assertEqual($review, 'Reviewed'); } - + public function testIndivGrades() { $this->session->open($this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/1/Detail'); @@ -577,20 +571,20 @@ function($session) { return ($button->attribute('value') == 'Unrelease Grades'); } ); - + $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td')->text(); $this->assertEqual($rating, '2.80 - (0.28)* = 2.52 ( )* : 10% late penalty. (84%)'); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/h2/font')->text(); $this->assertEqual($header, 'Comments Not Released Yet'); - + $this->waitForLogoutLogin('redshirt0002'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]')->text(); $this->assertEqual($header, 'Comments/Grades Not Released Yet'); } - + public function testIndivComments() { $this->waitForLogoutLogin('root'); @@ -603,7 +597,7 @@ function($session) { return ($button->attribute('value') == 'Release Grades'); } ); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panel1Content"]/input[2]')->click(); $w->until( function($session) { @@ -611,7 +605,7 @@ function($session) { return ($button->attribute('value') == 'Unrelease Comments'); } ); - + $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td')->text(); @@ -634,7 +628,7 @@ function($session) { } ); } - + public function testReleaseAllComments() { $this->session->open($this->url.'evaluations/view/'.$this->eventId); @@ -646,22 +640,22 @@ function($session) { return ($comments->text() == 'Some Released'); } ); - + $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/h2/font'); $this->assertEqual($header->text(), 'Grades Not Released Yet'); - + $this->waitForLogoutLogin('redshirt0002'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/h2/font'); $this->assertEqual($header->text(), 'Grades Not Released Yet'); - + $this->waitForLogoutLogin('redshirt0003'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/h2/font'); $this->assertEqual($header->text(), 'Grades Not Released Yet'); - + $this->waitForLogoutLogin('root'); $this->session->open($this->url.'evaluations/view/'.$this->eventId); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Unrelease All Comments')->click(); @@ -672,7 +666,7 @@ function($session) { } ); } - + public function testReleaseAllGrades() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Release All Grades')->click(); @@ -690,21 +684,21 @@ function($session) { $this->assertEqual($rating->text(), '2.80 - (0.28)* = 2.52 ( )* : 10% late penalty. (84%)'); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/h2/font'); $this->assertEqual($header->text(), 'Comments Not Released Yet'); - + $this->waitForLogoutLogin('redshirt0002'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td'); $this->assertEqual($rating->text(), '2.40 - (0.24)* = 2.16 ( )* : 10% late penalty. (72%)'); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/h2/font'); $this->assertEqual($header->text(), 'Comments Not Released Yet'); - + $this->waitForLogoutLogin('redshirt0003'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td'); $this->assertEqual($rating->text(), '1.87 - (0.19)* = 1.68 ( )* : 10% late penalty. (56%)'); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/h2/font'); $this->assertEqual($header->text(), 'Comments Not Released Yet'); - + $this->waitForLogoutLogin('root'); $this->session->open($this->url.'evaluations/view/'.$this->eventId); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Unrelease All Grades')->click(); @@ -715,7 +709,7 @@ function($session) { } ); } - + public function testSavedAnswersNotSubmitted() { // unsubmitted answers should not show up in student / instructor's results views @@ -748,7 +742,7 @@ function($session) { return $grades == 'Some Released'; } ); - + // Matt Student submits $this->waitForLogoutLogin('redshirt0003'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); @@ -775,14 +769,14 @@ function($session) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td')->text(); $this->assertEqual($rating, '2.80 - (0.28)* = 2.52 ( )* : 10% late penalty. (84%)'); - + // Matt's evaluation for Ed is not counted yet - it's not submitted $this->waitForLogoutLogin('root'); $this->session->open($this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/1/Detail'); $mark = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[2]/td[5]')->text(); $this->assertEqual($mark, '2.80 - 0.28 = 2.52 (84.00%)'); } - + public function testSubmissionsAfterEvalReleased() { $this->waitForLogoutLogin('redshirt0003'); @@ -804,13 +798,13 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your Evaluation was submitted successfully.'); - + // check Matt Student's results $mixevals = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation'); $mixevals[1]->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td'); $this->assertEqual($rating->text(), '1.87 - (0.19)* = 1.68 ( )* : 10% late penalty. (56%)'); - + // Ed Student's grades and comments should not be released $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); @@ -819,7 +813,7 @@ function($session) { $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); $this->assertEqual($header->text(), 'Comments/Grades Not Released Yet'); } - + public function testDeleteEvent() { $this->waitForLogoutLogin('root'); @@ -834,23 +828,23 @@ function($session) { $this->assertEqual($msg, 'The event has been deleted successfully.'); $this->assignToGroup(); } - + public function testScoreDropdown() { // TODO - put scoredropdown question into sample mixed eval template and // adjust tests accordingly - + // add template $this->session->open($this->url.'mixevals/add'); $name = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalName'); $name->sendKeys('Final Project Evaluation'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="MixevalMixevalQuestionTypePeer"] option[value="4"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'button[onclick="insertQ(false);"]')->click(); $question = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion0Title'); $question->sendKeys('Distributed Marks'); - + $instructions = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'MixevalQuestion0Instructions'); $instructions->sendKeys('Distribute the marks among your members.'); @@ -886,7 +880,7 @@ function($session) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateEnd')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[title="Next"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, '28')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="GroupGroup"] option[value="1"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); @@ -895,7 +889,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + // do the evaluation $this->waitForLogoutLogin('tutor1'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); @@ -904,7 +898,7 @@ function($session) { $this->assertEqual(count($marks), 93); $selects = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select'); $this->assertEqual(count($selects), 3); - + // do the evaluation $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Mixed Evaluation')->click(); @@ -932,7 +926,7 @@ function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); } ); - + // delete the event and template $this->waitForLogoutLogin('root'); $this->session->open($this->url.'events/index/1'); @@ -950,7 +944,7 @@ function($session) { } ); } - + public function testSelfEvaluation() { $this->session->open($this->url.'mixevals/add'); @@ -983,7 +977,7 @@ function($session) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'With Self-Evaluation')->click(); $this->templateId = end(explode('/', $this->session->url())); } - + public function testSelfEvaluationEvent() { $this->session->open($this->url.'events/add/1'); @@ -1016,7 +1010,7 @@ function($session) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Eval with Self-Eval')->click(); $this->eventId = end(explode('/', $this->session->url())); } - + public function testAnswerSelfEval() { $this->waitForLogoutLogin('redshirt0001'); @@ -1034,7 +1028,7 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your Evaluation was submitted successfully.'); - + $this->waitForLogoutLogin('redshirt0002'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Eval with Self-Eval')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table/tbody/tr/td/form/div[2]/table/tbody/tr[2]/td[1]/input')->click(); @@ -1053,7 +1047,7 @@ function($session) { $text = $this->session->elements(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="3535EvaluationMixeval3QuestionComment"]'); $this->assertTrue(empty($text)); // no self-evaluation questions for tutors } - + public function testEvaluationResults() { $this->waitForLogoutLogin('root'); @@ -1072,7 +1066,7 @@ public function testEvaluationResults() $this->assertEqual($matt->text(), '4.17 (83.30%)'); $avg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[5]/tbody/tr[5]/td[2]'); $this->assertEqual($avg->text(), '3.61'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Detail')->click(); $peer1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[1]/th[2]'); $this->assertEqual($peer1->text(), '1 (/5.0)'); @@ -1084,7 +1078,7 @@ public function testEvaluationResults() $this->assertEqual($matt->text(), '4.17'); $avg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[4]/tbody/tr[5]/td[2]'); $this->assertEqual($avg->text(), '3.61'); - + $selfPanel = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'panelSelf'); $this->assertTrue(!empty($selfPanel)); $self1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/h3[1]'); @@ -1100,11 +1094,11 @@ public function testEvaluationResults() $alex = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="mixeval_result"]/ul[2]/li[2]'); $this->assertEqual($alex->text(), "Alex Student:It was amazing."); } - + public function testStudentSelfEvaluationResult() { $this->session->open($this->url.'events/edit/'.$this->eventId); - $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateBegin')->clear(); + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateBegin')->clear(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateBegin')->sendKeys(date('Y-m-d H:i:s')); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[type="submit"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); @@ -1143,7 +1137,7 @@ function($session) { } ); } - + public function secondStudent() { $this->waitForLogoutLogin('redshirt0002'); @@ -1156,7 +1150,7 @@ public function secondStudent() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '55EvaluationMixeval4QuestionComment')->sendKeys('cat'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, 'data[5][EvaluationMixeval][5][question_comment]')->sendKeys('dog'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EvaluationMixeval5EvaluationMixeval6QuestionComment')->sendKeys('gerbil'); - + // Likert questions $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table/tbody/tr/td/form/div[8]/table/tbody/tr[2]/td[3]/input')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table/tbody/tr/td/form/div[9]/table/tbody/tr[2]/td[3]/input')->click(); @@ -1175,7 +1169,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your Evaluation was submitted successfully.'); } - + public function tutor() { $this->waitForLogoutLogin('tutor1'); @@ -1196,7 +1190,7 @@ public function tutor() // short and long answers $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '66EvaluationMixeval4QuestionComment')->sendKeys('one'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, 'data[6][EvaluationMixeval][5][question_comment]')->sendKeys('two'); - + // Likert questions $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table/tbody/tr/td/form/div[14]/table/tbody/tr[2]/td[2]/input')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table/tbody/tr/td/form/div[15]/table/tbody/tr[2]/td[2]/input')->click(); @@ -1205,7 +1199,7 @@ public function tutor() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '77EvaluationMixeval4QuestionComment')->sendKeys('right'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, 'data[7][EvaluationMixeval][5][question_comment]')->sendKeys('left'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '77EvaluationMixeval6QuestionComment')->sendKeys('forward'); - + // submit $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'submit')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); @@ -1233,7 +1227,7 @@ function($session) { } ); } - + public function assignToGroup() { $this->session->open($this->url.'groups/edit/1'); @@ -1247,4 +1241,4 @@ function($session) { } ); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/student_rubric.test.php b/app/tests/cases/system/student_rubric.test.php index e0717c2c1..bc97582fb 100644 --- a/app/tests/cases/system/student_rubric.test.php +++ b/app/tests/cases/system/student_rubric.test.php @@ -4,28 +4,22 @@ class studentRubric extends SystemBaseTestCase { protected $eventId = 0; - + public function startCase() { - $this->getUrl(); echo "Start StudentRubric system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testCreateEvent() { $this->session->open($this->url.'events/add/1'); @@ -34,7 +28,7 @@ public function testCreateEvent() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEventTemplateTypeId"] option[value="2"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventComReq1')->click(); // comments required $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventAutoRelease1')->click(); - + // set due date and release date end to next month so that the event is opened. $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDueDate')->clear(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDueDate')->sendKeys(date('Y-m-d H:i:s')); @@ -48,11 +42,11 @@ public function testCreateEvent() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateEnd')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'a[title="Next"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, '28')->click(); - + // add penalty $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Add Penalty')->click();; $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="Penalty0PercentPenalty"] option[value="10"]')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="GroupGroup"] option[value="1"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="GroupGroup"] option[value="2"]')->click(); @@ -66,7 +60,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Add event successful!'); } - + public function testStudent() { $this->waitForLogoutLogin('redshirt0001'); @@ -74,14 +68,14 @@ public function testStudent() // check that there is at least one pending event $this->assertEqual(substr($pending, -22), 'Pending Event(s) Total'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); - + // check saving answers alert $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Home')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); - + $comments = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); $this->assertEqual($comments->text(), 'Required'); - + // check penalty note $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, '( Show/Hide late penalty policy )')->click(); $penalty = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'penalty')->text(); @@ -89,7 +83,7 @@ public function testStudent() // check disabled submit button $submit = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit to Complete the Evaluation"]'); $this->assertTrue($submit->attribute('disabled')); - + // check the questions are not in red $ques1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '6criteria1'); $ques2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '6criteria2'); @@ -97,7 +91,7 @@ public function testStudent() $this->assertFalse($ques1->attribute('color')); $this->assertFalse($ques2->attribute('color')); $this->assertFalse($ques3->attribute('color')); - + // Alex Student $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'panel6Header'); $this->assertEqual($header->text(), 'Alex Student - (click to expand)'); @@ -108,7 +102,7 @@ public function testStudent() $comments[2]->sendKeys('very punctual'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '6gen_comment')->sendKeys('awesome'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '6')->click(); - + // check that only the second ques is marked red $ques1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '6criteria1'); $ques2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '6criteria2'); @@ -119,7 +113,7 @@ public function testStudent() // warning message $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, '6likert'); $this->assertEqual($msg->text(), 'Please complete all the questions marked red before saving.'); - + // answer question 2 + save $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[onclick="document.evalForm.selected_lom_6_2.value=5;"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '6')->click(); @@ -156,14 +150,14 @@ function($session) { $radio3 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[onclick="document.evalForm.selected_lom_6_3.value=5;"]'); $this->assertTrue($radio1->attribute('checked')); $this->assertTrue($radio2->attribute('checked')); - $this->assertTrue($radio3->attribute('checked')); + $this->assertTrue($radio3->attribute('checked')); $comments = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::NAME, '6comments[]'); $this->assertEqual($comments[0]->text(), 'participated lots'); $this->assertEqual($comments[1]->text(), 'very co-operative'); $this->assertEqual($comments[2]->text(), 'very punctual'); $comment = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '6gen_comment'); $this->assertEqual($comment->text(), 'awesome'); - + // Matt Student $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'panel7Header')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[onclick="document.evalForm.selected_lom_7_1.value=3;"]')->click(); @@ -185,7 +179,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your Evaluation was submitted successfully.'); } - + public function testReSubmit() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); @@ -201,7 +195,7 @@ public function testReSubmit() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '6gen_comment')->clear(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '6gen_comment')->sendKeys('good job'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '6')->click(); - + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { @@ -222,22 +216,22 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'flashMessage')->text(); $this->assertEqual($msg, 'Your evaluation has been saved.'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Home')->click(); - + $this->secondStudent(); $this->tutor(); } - + public function testBasicResult() { $this->waitForLogoutLogin('root'); $this->removeFromGroup(); - + $this->session->open($this->url.'events/index/1'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); $this->eventId = end(explode('/', $this->session->url())); - + // edit event's release date end to test final penalty // edit event's result release date begin to test student view of the results $this->session->open($this->url.'events/edit/'.$this->eventId); @@ -246,7 +240,7 @@ public function testBasicResult() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateBegin')->clear(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventResultReleaseDateBegin')->sendKeys(date('Y-m-d H:i:s')); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit"]')->click(); - $w = new PHPWebDriver_WebDriverWait($this->session); + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); @@ -256,11 +250,11 @@ function($session) { $this->session->open($this->url.'evaluations/view/'.$this->eventId); $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); $this->assertEqual($title, 'MECH 328 - Mechanical Engineering Design Project > Rubric Evaluation > Results'); - + //auto-release results message $msg = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'autoRelease_msg'); $this->assertTrue(!empty($msg)); - + // check lates $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, '3 Late')->click(); $ed = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td[4]'); @@ -271,7 +265,7 @@ function($session) { $this->assertEqual($matt->text(), '(not submitted)'); $matt = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[4]/td[4]'); $this->assertEqual($matt->text(), '---'); - + // view summary table $this->session->open($this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/1'); $notSubmit = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[1]/th')->text(); @@ -282,7 +276,7 @@ function($session) { $this->assertEqual($left, 'Left the group, but had submitted or were evaluated'); $left = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[3]/tbody/tr[2]/td')->text(); $this->assertEqual($left, 'Tutor 1 (TA)'); - + // evaluation results table $total = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]/tbody/tr[1]/th[2]')->text(); $this->assertEqual($total, 'Total : (/15.00)'); @@ -294,11 +288,11 @@ function($session) { $this->assertEqual($ed, '13.00 - 1.30 = 11.70'); $avg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[4]/tbody/tr[5]/td[2]')->text(); $this->assertEqual($avg, '10.80'); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Basic')->click(); $this->assertEqual($this->session->url(), $this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/1/Basic'); } - + public function testDetailSummaryResult() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Detail')->click(); @@ -311,7 +305,7 @@ public function testDetailSummaryResult() $this->assertEqual($left, 'Left the group, but had submitted or were evaluated'); $left = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/div[3]/table[3]/tbody/tr[2]/td')->text(); $this->assertEqual($left, 'Tutor 1 (TA)'); - + // header $ques1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[1]/th[2]')->text(); $ques2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[1]/th[3]')->text(); @@ -321,7 +315,7 @@ public function testDetailSummaryResult() $this->assertEqual($ques2, '2 (/5.0)'); $this->assertEqual($ques3, '3 (/5.0)'); $this->assertEqual($total, 'Total (/15.00)'); - + // individual marks $alex = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[2]/td[2]')->text(); $matt = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[3]/td[2]')->text(); @@ -331,7 +325,7 @@ public function testDetailSummaryResult() $this->assertEqual($matt, '4.00'); $this->assertEqual($ed, '4.50'); $this->assertEqual($avg, '4.17'); - + $alex = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[2]/td[3]')->text(); $matt = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[3]/td[3]')->text(); $ed = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[4]/td[3]')->text(); @@ -340,7 +334,7 @@ public function testDetailSummaryResult() $this->assertEqual($matt, '3.67'); $this->assertEqual($ed, '4.00'); $this->assertEqual($avg, '3.72'); - + $alex = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[2]/td[4]')->text(); $matt = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[3]/td[4]')->text(); $ed = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[4]/td[4]')->text(); @@ -349,7 +343,7 @@ public function testDetailSummaryResult() $this->assertEqual($matt, '4.33'); $this->assertEqual($ed, '4.50'); $this->assertEqual($avg, '4.11'); - + $alex = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[2]/td[5]')->text(); $matt = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[3]/td[5]')->text(); $ed = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[4]/td[5]')->text(); @@ -359,12 +353,12 @@ public function testDetailSummaryResult() $this->assertEqual($ed, '13.00 - 1.30 = 11.70 (78.00%)'); $this->assertEqual($avg, '10.80'); } - + public function testDetailResult() { // Alex $alex = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'panel1Content'); - $this->assertEqual(substr($alex->text(), 0, 116), + $this->assertEqual(substr($alex->text(), 0, 116), "(Number of Evaluator(s): 2)\nFinal Total: 11.00 - 1.10 = 9.90 (66%) << Below Group Average >>\nNOTE: 10% Late Penalty"); $ques1 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panel1Content"]/table/tbody/tr[1]/th[2]'); $ques2 = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panel1Content"]/table/tbody/tr[1]/th[3]'); @@ -395,11 +389,11 @@ public function testDetailResult() $this->assertEqual(substr($edGen, 0, 37), "General Comment:\nacceptable"); $auto = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'autoRelease_msg')->text(); $this->assertEqual($auto, "Auto Release is ON, you do not need to manually release the grades and comments"); - + // blue class for removed members - Tutor 1 $tutor = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panel1Content"]/table/tbody/tr[4]/td[1]'); $this->assertEqual($tutor->attribute('class'), 'blue'); - + // matt's panel $matt = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::ID, 'panel7'); $this->assertTrue(!empty($matt)); @@ -410,7 +404,7 @@ public function testDetailResult() $tutor = $this->session->elements(PHPWebDriver_WebDriverBy::ID, 'panel35'); $this->assertTrue(empty($tutor)); } - + public function testStudentResults() { // student that did not submit - Matt Student @@ -418,23 +412,23 @@ public function testStudentResults() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td')->text(); $this->assertEqual($rating, '12.00 - (1.20)* = 10.80 ( )* : 10% late penalty.'); - + // student that submitted - Ed Student $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td')->text(); $this->assertEqual($rating, '13.00 - (1.30)* = 11.70 ( )* : 10% late penalty.'); - // the tables within the accordion is created using the same code for the tables + // the tables within the accordion is created using the same code for the tables // in the instructor's view which has been tested } - + public function testNoDetails() { $this->waitForLogoutLogin('root'); $this->session->open($this->url.'events/edit/'.$this->eventId); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventEnableDetails0')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit"]')->click(); - $w = new PHPWebDriver_WebDriverWait($this->session); + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); @@ -451,7 +445,7 @@ function($session) { $this->assertEqual($ques2->text(), '3.50'); $this->assertEqual($ques3->text(), '3.50'); } - + public function testTutorInInstructorView() { $this->waitForLogoutLogin('root'); @@ -464,14 +458,14 @@ public function testTutorInInstructorView() $tutor = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panel1Content"]/table/tbody/tr[4]/td[1]'); $this->assertFalse($tutor->attribute('class')); } - + public function testRelease() { $this->session->open($this->url.'events/edit/'.$this->eventId); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventAutoRelease0')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventEnableDetails1')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit"]')->click(); - $w = new PHPWebDriver_WebDriverWait($this->session); + $w = new PHPWebDriver_WebDriverWait($this->session); $w->until( function($session) { return count($session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")); @@ -489,7 +483,7 @@ function($session) { } ); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Detail')->click(); - + // release Alex's grades $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panel1Content"]/input[1]')->click(); $w->until( @@ -499,7 +493,7 @@ function($session) { } ); } - + public function testReleasedGrades() { // check Alex's results @@ -509,13 +503,13 @@ public function testReleasedGrades() $this->assertEqual($rating->text(), '11.00 - (1.10)* = 9.90 ( )* : 10% late penalty.'); $red = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); $this->assertEqual($red[3]->text(), 'Comments Not Released Yet.'); - + $grade = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panelResultsContent"]/table/tbody/tr[2]/td[2]'); $testGrades = $this->shuffled(substr($grade->text(), 15, 4)); // if fails - invalid grade was passed - should only be 3.00 or 5.00 $this->assertTrue($testGrades); } - + public function testReleasedComments() { // unrelease Alex's grades and release Alex's comments @@ -538,20 +532,20 @@ function($session) { return ($button->attribute('value') == 'Unrelease Comments'); } ); - + $this->waitForLogoutLogin('redshirt0002'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td'); $this->assertEqual($rating->text(), 'Not Released'); $red = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); $this->assertEqual($red->text(), 'Grades Not Released Yet.'); - + $comment = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panelResultsContent"]/table/tbody/tr[2]/td[2]'); $testComments = $this->shuffled(substr($comment->text(), 32)); // if fails - invalid comment was passed - should only be giraffe or very active in the group $this->assertTrue($testComments); } - + public function testNothingReleased() { // check Ed's results @@ -564,7 +558,7 @@ public function testNothingReleased() $commentsGrades = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panelResultsContent"]/table/tbody/tr[2]/td/font'); $this->assertEqual($commentsGrades->text(), 'Comments/Grades Not Released Yet.'); } - + public function testReleaseAllGrades() { $this->waitForLogoutLogin('root'); @@ -587,30 +581,30 @@ function($session) { return ($cell->text() == 'Some Released'); } ); - + $this->waitForLogoutLogin('redshirt0002'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td'); $this->assertEqual($rating->text(), '11.00 - (1.10)* = 9.90 ( )* : 10% late penalty.'); $red = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); $this->assertEqual($red[3]->text(), 'Comments Not Released Yet.'); - + $grade = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panelResultsContent"]/table/tbody/tr[2]/td[2]'); $testGrades = $this->shuffled(substr($grade->text(), 15, 4)); // if fails - invalid grade was passed - should only be 3.00 or 5.00 $this->assertTrue($testGrades); - + $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); $red = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); $this->assertEqual($red[3]->text(), 'Comments Not Released Yet.'); - + $this->waitForLogoutLogin('redshirt0003'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); $red = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); $this->assertEqual($red[3]->text(), 'Comments Not Released Yet.'); } - + public function testReleaseAllComments() { $this->waitForLogoutLogin('root'); @@ -631,29 +625,29 @@ function($session) { return ($cell->text() == 'Some Released'); } ); - + $this->waitForLogoutLogin('redshirt0002'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td'); $this->assertEqual($rating->text(), 'Not Released'); $red = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); $this->assertEqual($red->text(), 'Grades Not Released Yet.'); - + $comment = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="panelResultsContent"]/table/tbody/tr[2]/td[2]'); $testComments = $this->shuffled(substr($comment->text(), 32)); // if fails - invalid comment was passed - should only be giraffe or very active in the group $this->assertTrue($testComments); - + $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); $red = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); $this->assertEqual($red->text(), 'Grades Not Released Yet.'); - + $this->waitForLogoutLogin('redshirt0003'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); $red = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); $this->assertEqual($red->text(), 'Grades Not Released Yet.'); - + $this->waitForLogoutLogin('root'); $this->session->open($this->url.'evaluations/view/'.$this->eventId); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Unrelease All Comments')->click(); @@ -664,7 +658,7 @@ function($session) { } ); } - + public function testSavedAnswersNotSubmitted() { // unsubmitted answers should not show up in student / instructor's results views @@ -697,7 +691,7 @@ function($session) { return $grades == 'Some Released'; } ); - + // Matt Student submits $this->waitForLogoutLogin('redshirt0003'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); @@ -712,21 +706,21 @@ function($session) { $comments[2]->sendKeys('rectangle'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '5gen_comment')->sendKeys('shapes'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '5')->click(); - + // check Ed's results $this->session->open($this->url); $this->logoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td')->text(); $this->assertEqual($rating, '13.00 - (1.30)* = 11.70 ( )* : 10% late penalty.'); - + // Matt's evaluation for Ed is not counted yet - it's not submitted $this->waitForLogoutLogin('root'); $this->session->open($this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/1/Detail'); $mark = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="evalForm"]/table/tbody/tr[4]/td[5]')->text(); $this->assertEqual($mark, '13.00 - 1.30 = 11.70 (78.00%)'); } - + public function testSubmissionsAfterEvalReleased() { $this->waitForLogoutLogin('redshirt0003'); @@ -751,7 +745,7 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your Evaluation was submitted successfully.'); - + // comments and grades become unreleased for Ed Student $this->waitForLogoutLogin('redshirt0001'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); @@ -759,7 +753,7 @@ function($session) { $this->assertEqual($rating->text(), 'Not Released'); $header = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'font[color="red"]'); $this->assertEqual($header->text(), 'Comments/Grades Not Released Yet.'); - + // comments and grades are still released for Matt Student - no evaluations for him $this->waitForLogoutLogin('redshirt0003'); $rubric = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation'); @@ -767,7 +761,7 @@ function($session) { $rating = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table[2]/tbody/tr[2]/td'); $this->assertEqual($rating->text(), '12.00 - (1.20)* = 10.80 ( )* : 10% late penalty.'); } - + public function testDeleteEvent() { $this->waitForLogoutLogin('root'); @@ -781,12 +775,12 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The event has been deleted successfully.'); } - + public function secondStudent() { $this->waitForLogoutLogin('redshirt0002'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); - + // Ed Student $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[onclick="document.evalForm.selected_lom_5_1.value=5;"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[onclick="document.evalForm.selected_lom_5_2.value=5;"]')->click(); @@ -797,7 +791,7 @@ public function secondStudent() $comments[2]->sendKeys('ghi'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '5gen_comment')->sendKeys('excellent'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '5')->click(); - + // Matt Student $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'panel7Header')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[onclick="document.evalForm.selected_lom_7_1.value=5;"]')->click(); @@ -820,12 +814,12 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your Evaluation was submitted successfully.'); } - + public function tutor() { $this->waitForLogoutLogin('tutor1'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Rubric Evaluation')->click(); - + // Ed Student $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[onclick="document.evalForm.selected_lom_5_1.value=4;"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[onclick="document.evalForm.selected_lom_5_2.value=3;"]')->click(); @@ -836,7 +830,7 @@ public function tutor() $comments[2]->sendKeys('cop'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '5gen_comment')->sendKeys('good work'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '5')->click(); - + // Alex Student $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'panel6Header')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[onclick="document.evalForm.selected_lom_6_1.value=3;"]')->click(); @@ -848,7 +842,7 @@ public function tutor() $comments[2]->sendKeys('monkey'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '6gen_comment')->sendKeys('acceptable'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::NAME, '6')->click(); - + $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'panel7Header')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[onclick="document.evalForm.selected_lom_7_1.value=4;"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[onclick="document.evalForm.selected_lom_7_2.value=3;"]')->click(); @@ -886,7 +880,7 @@ function($session) { } ); } - + public function assignToGroup() { $this->session->open($this->url.'groups/edit/1'); @@ -900,7 +894,7 @@ function($session) { } ); } - + public function shuffled($text) { if ($text == '3.00') { @@ -979,4 +973,4 @@ public function shuffled($text) return false; } } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/student_simple.test.php b/app/tests/cases/system/student_simple.test.php index 2550bd8ce..dd47d626f 100644 --- a/app/tests/cases/system/student_simple.test.php +++ b/app/tests/cases/system/student_simple.test.php @@ -7,15 +7,9 @@ class studentSimple extends SystemBaseTestCase public function startCase() { - $this->getUrl(); echo "Start StudentSimple system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); + $this->getSession()->open($this->url); - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } diff --git a/app/tests/cases/system/student_survey.test.php b/app/tests/cases/system/student_survey.test.php index 13b45c4d4..56de8c61d 100644 --- a/app/tests/cases/system/student_survey.test.php +++ b/app/tests/cases/system/student_survey.test.php @@ -4,28 +4,22 @@ class studentSurvey extends SystemBaseTestCase { protected $eventId = 0; - + public function startCase() { - $this->getUrl(); echo "Start StudentSurvey system test.\n"; - $wd_host = 'http://localhost:4444/wd/hub'; - $this->web_driver = new SystemWebDriver($wd_host); - $this->session = $this->web_driver->session('firefox'); - $this->session->open($this->url); - - $w = new PHPWebDriver_WebDriverWait($this->session); - $this->session->deleteAllCookies(); + $this->getSession()->open($this->url); + $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login('root', 'ipeeripeer'); } - + public function endCase() { $this->session->deleteAllCookies(); $this->session->close(); } - + public function testCreateEvent() { $this->session->open($this->url.'events/add/1'); @@ -33,7 +27,7 @@ public function testCreateEvent() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDescription')->sendKeys('Description for the Survey.'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventEventTemplateTypeId"] option[value="3"]')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'select[id="EventSurvey"] option[value="2"]')->click(); - + //set due date and release date end to next month so that the event is opened. $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventDueDate')->click(); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'EventReleaseDateBegin')->click(); @@ -51,7 +45,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Add event successful!'); } - + public function testStudent() { $this->waitForLogoutLogin('redshirt0001'); @@ -63,7 +57,7 @@ public function testStudent() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'SurveyInputResponseId13')->click(); // single line $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'SurveyInput2ResponseText')->sendKeys('single line answer'); - // multi-line + // multi-line $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'SurveyInput3ResponseText')->sendKeys('multi line answer'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[value="Submit"]')->click(); $w = new PHPWebDriver_WebDriverWait($this->session); @@ -75,7 +69,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your survey was submitted successfully!'); } - + public function testStudentResult() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Survey')->click(); @@ -88,11 +82,11 @@ public function testStudentResult() $this->assertEqual($sl->text(), 'single line answer'); $ml = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="SurveyResults"]/pre'); $this->assertEqual($ml->text(), 'multi line answer'); - + $this->secondStudent(); $this->thirdStudent(); } - + public function testTutor() { // should not have access to survey @@ -100,7 +94,7 @@ public function testTutor() $survey = $this->session->elements(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Survey'); $this->assertTrue(empty($survey)); } - + public function testSurveyResults() { $this->waitForLogoutLogin('root'); @@ -108,11 +102,11 @@ public function testSurveyResults() $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Survey')->click(); $this->eventId = end(explode('/', $this->session->url())); $this->session->open($this->url.'evaluations/viewSurveySummary/'.$this->eventId); - + // multiple choice $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[1]/th')->text(); $this->assertEqual($title, '1. Testing out MC (3 responses)'); - + $a = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[2]/td[2]')->text(); $b = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[3]/td[2]')->text(); $c = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[4]/td[2]')->text(); @@ -121,7 +115,7 @@ public function testSurveyResults() $this->assertEqual($b, '1'); $this->assertEqual($c, '0'); $this->assertEqual($d, '1'); - + $a = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[2]/td[3]')->text(); $b = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[3]/td[3]')->text(); $c = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[4]/td[3]')->text(); @@ -130,7 +124,7 @@ public function testSurveyResults() $this->assertEqual($b, '33%'); $this->assertEqual($c, '-'); $this->assertEqual($d, '33%'); - + $a = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[2]/td[4]/div/div'); $b = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[3]/td[4]/div/div'); $c = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[4]/td[4]/div/div'); @@ -139,46 +133,46 @@ public function testSurveyResults() $this->assertEqual($b->attribute('style'), 'width: 33%;'); $this->assertEqual($c->attribute('style'), 'width: 0%;'); $this->assertEqual($d->attribute('style'), 'width: 33%;'); - + // multiple answers $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[6]/th')->text(); $this->assertEqual($title, '2. Testing out checkboxes (6 responses)'); - + $a = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[7]/td[2]')->text(); $b = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[8]/td[2]')->text(); $c = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[9]/td[2]')->text(); $this->assertEqual($a, '3'); $this->assertEqual($b, '1'); $this->assertEqual($c, '2'); - + $a = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[7]/td[3]')->text(); $b = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[8]/td[3]')->text(); $c = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[9]/td[3]')->text(); $this->assertEqual($a, '50%'); $this->assertEqual($b, '17%'); $this->assertEqual($c, '33%'); - + $a = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[7]/td[4]/div/div'); $b = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[8]/td[4]/div/div'); $c = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[9]/td[4]/div/div'); $this->assertEqual($a->attribute('style'), 'width: 50%;'); $this->assertEqual($b->attribute('style'), 'width: 17%;'); $this->assertEqual($c->attribute('style'), 'width: 33%;'); - + // single line answers $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[10]/th')->text(); $this->assertEqual($title, '3. Testing out single line answers (3 responses)'); - + $responders = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[11]/td[2]'); $this->assertEqual($responders->text(), 'Alex Student, Ed Student, Matt Student'); - + // multi line answers $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[12]/th')->text(); $this->assertEqual($title, '4. Testing out multi-line long answers (3 responses)'); - + $responders = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '/html/body/div[1]/table/tbody/tr[13]/td[2]'); $this->assertEqual($responders->text(), 'Alex Student, Ed Student, Matt Student'); - + // 3 results $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'input[aria-controls="individualResponses"]')->sendKeys('Result'); $w = new PHPWebDriver_WebDriverWait($this->session); @@ -190,7 +184,7 @@ function($session) { ); $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, "individualResponses_info")->text(); $this->assertEqual($msg, 'Showing 1 to 3 of 3 entries (filtered from 13 total entries)'); - + $results = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Result'); $href0 = $results[0]->attribute('href'); $href1 = $results[1]->attribute('href'); @@ -198,7 +192,7 @@ function($session) { $this->assertEqual($href0, $this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/5'); $this->assertEqual($href1, $this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/6'); $this->assertEqual($href2, $this->url.'evaluations/viewEvaluationResults/'.$this->eventId.'/7'); - + $this->session->open($href0); $mc = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'ol li strong[class="green"]'); $this->assertEqual($mc->text(), 'B'); @@ -209,7 +203,7 @@ function($session) { $this->assertEqual($sl->text(), 'single line answer'); $ml = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="SurveyResults"]/pre'); $this->assertEqual($ml->text(), 'multi line answer'); - + $this->session->open($href1); $mc = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'ol li strong[class="green"]'); $this->assertEqual($mc->text(), 'A'); @@ -220,7 +214,7 @@ function($session) { $this->assertEqual($sl->text(), 'this is a short answer'); $ml = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="SurveyResults"]/p[2]'); $this->assertEqual($ml->text(), '-- No Answer --'); - + $this->session->open($href2); $mc = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, 'ol li strong[class="green"]'); $this->assertEqual($mc->text(), 'D'); @@ -232,7 +226,7 @@ function($session) { $ml = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::XPATH, '//*[@id="SurveyResults"]/pre'); $this->assertEqual($ml->text(), 'long long long'); } - + public function testDelete() { $this->session->open($this->url.'events/delete/'.$this->eventId); @@ -245,7 +239,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'The event has been deleted successfully.'); } - + public function secondStudent() { $this->waitForLogoutLogin('redshirt0002'); @@ -264,7 +258,7 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your survey was submitted successfully!'); } - + public function thirdStudent() { $this->waitForLogoutLogin('redshirt0003'); @@ -283,4 +277,4 @@ function($session) { $msg = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "div[class='message good-message green']")->text(); $this->assertEqual($msg, 'Your survey was submitted successfully!'); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/system_base.php b/app/tests/cases/system/system_base.php index 3fee1d11c..74817aad7 100644 --- a/app/tests/cases/system/system_base.php +++ b/app/tests/cases/system/system_base.php @@ -11,27 +11,44 @@ class SystemBaseTestCase extends CakeTestCase { protected $web_driver; - protected $session; + protected $session = null; protected $url; - - /** - * helper function to get the testing server url - **/ - public function getURL() { + protected $browser; + protected $capabilities; + protected $seleniumUrl; + + public function __construct() + { + // give it a default timezone $timezone = ini_get('date.timezone') ? ini_get('date.timezone') : 'UTC'; date_default_timezone_set($timezone); // set the default time zone - if (!($server = getenv('SERVER_TEST'))) { - $server = 'http://localhost:2000/'; + + // set up the test environment according to the environment values + $this->browser = getenv('SELENIUM_BROWSER') ? getenv('SELENIUM_BROWSER') : 'firefox'; + $this->capabilities['platform'] = getenv('SELENIUM_PLATFORM') ? getenv('SELENIUM_PLATFORM')) : 'ANY'; + $this->capabilities['version'] = getenv('SELENIUM_VERSION') ? getenv('SELENIUM_VERSION')) : ''; + $this->seleniumUrl = getenv('SELENIUM_PLATFORM') ? getenv('SELENIUM_PLATFORM') : 'http://localhost:4444/wd/hub'; + $this->url = getenv('SERVER_TEST') ? getenv('SERVER_TEST') : 'http://localhost:2000/'; + + $this->web_driver = new SystemWebDriver($this->seleniumUrl); + $this->session = $this->getSession(); + $this->session->deleteAllCookies(); + } + + public function getSession($new = false) { + if ($this->session == null || $new == true) { + return $this->web_driver->session($this->browser, $this->capabilities); + } else { + return $this->session; } - $this->url = $server; } - + public function waitForLogoutLogin($username) { $this->session->open($this->url); $this->logoutLogin($username); } - + public function logoutLogin($username) { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Logout')->click(); @@ -46,7 +63,7 @@ function($session) { $login = PageFactory::initElements($this->session, 'Login'); $home = $login->login($username, 'ipeeripeer'); } - + public function startTest($method) { echo 'Starting method ' . $method . "\n"; } @@ -54,4 +71,4 @@ public function startTest($method) { public function endTest($method) { echo 'Ending method ' . $method . "\n"; } -} \ No newline at end of file +} From 418566d26529a143fe470d6a7cb2fe19f8d27234 Mon Sep 17 00:00:00 2001 From: Compass Date: Thu, 27 Feb 2014 16:37:37 -0800 Subject: [PATCH 45/91] Fix a typo from previous commit --- app/tests/cases/system/system_base.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/tests/cases/system/system_base.php b/app/tests/cases/system/system_base.php index 74817aad7..c320c1847 100644 --- a/app/tests/cases/system/system_base.php +++ b/app/tests/cases/system/system_base.php @@ -25,8 +25,8 @@ public function __construct() // set up the test environment according to the environment values $this->browser = getenv('SELENIUM_BROWSER') ? getenv('SELENIUM_BROWSER') : 'firefox'; - $this->capabilities['platform'] = getenv('SELENIUM_PLATFORM') ? getenv('SELENIUM_PLATFORM')) : 'ANY'; - $this->capabilities['version'] = getenv('SELENIUM_VERSION') ? getenv('SELENIUM_VERSION')) : ''; + $this->capabilities['platform'] = getenv('SELENIUM_PLATFORM') ? getenv('SELENIUM_PLATFORM') : 'ANY'; + $this->capabilities['version'] = getenv('SELENIUM_VERSION') ? getenv('SELENIUM_VERSION') : ''; $this->seleniumUrl = getenv('SELENIUM_PLATFORM') ? getenv('SELENIUM_PLATFORM') : 'http://localhost:4444/wd/hub'; $this->url = getenv('SERVER_TEST') ? getenv('SERVER_TEST') : 'http://localhost:2000/'; From 52171bd0904f50416bbdfabcceddae90567d0084 Mon Sep 17 00:00:00 2001 From: Compass Date: Thu, 27 Feb 2014 16:38:01 -0800 Subject: [PATCH 46/91] Add integration tests to CI build --- build.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/build.xml b/build.xml index f4530198b..170fec3e4 100644 --- a/build.xml +++ b/build.xml @@ -229,6 +229,7 @@ + From 45b36832e6204225fb7f160d9c41c6c82d84738f Mon Sep 17 00:00:00 2001 From: Compass Date: Thu, 27 Feb 2014 22:14:48 -0800 Subject: [PATCH 47/91] Add webdriver as submodule It seems there are some problem with PEAR to install webdriver. So including webdriver as a submodule in iPeer code base --- .gitmodules | 3 +++ app/tests/cases/system/SystemWebDriver.php | 2 +- app/tests/cases/system/SystemWebDriverSession.php | 8 ++++---- app/tests/cases/system/system_base.php | 10 +++++----- vendors/webdriver | 1 + 5 files changed, 14 insertions(+), 10 deletions(-) create mode 160000 vendors/webdriver diff --git a/.gitmodules b/.gitmodules index 90f06a74c..28967518d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -37,3 +37,6 @@ [submodule "puppet/modules/db"] path = puppet/modules/db url = https://github.com/ubc/puppet-db.git +[submodule "vendors/webdriver"] + path = vendors/webdriver + url = https://github.com/Element-34/php-webdriver.git diff --git a/app/tests/cases/system/SystemWebDriver.php b/app/tests/cases/system/SystemWebDriver.php index 6302aaebd..f6247254e 100644 --- a/app/tests/cases/system/SystemWebDriver.php +++ b/app/tests/cases/system/SystemWebDriver.php @@ -1,5 +1,5 @@ elements($using, $value); } -} \ No newline at end of file +} diff --git a/app/tests/cases/system/system_base.php b/app/tests/cases/system/system_base.php index c320c1847..aee4a15e6 100644 --- a/app/tests/cases/system/system_base.php +++ b/app/tests/cases/system/system_base.php @@ -1,11 +1,11 @@ Date: Thu, 27 Feb 2014 22:44:38 -0800 Subject: [PATCH 48/91] Add some debug info for integration test --- app/tests/cases/system/system_base.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/tests/cases/system/system_base.php b/app/tests/cases/system/system_base.php index aee4a15e6..65cba1a9c 100644 --- a/app/tests/cases/system/system_base.php +++ b/app/tests/cases/system/system_base.php @@ -27,9 +27,15 @@ public function __construct() $this->browser = getenv('SELENIUM_BROWSER') ? getenv('SELENIUM_BROWSER') : 'firefox'; $this->capabilities['platform'] = getenv('SELENIUM_PLATFORM') ? getenv('SELENIUM_PLATFORM') : 'ANY'; $this->capabilities['version'] = getenv('SELENIUM_VERSION') ? getenv('SELENIUM_VERSION') : ''; - $this->seleniumUrl = getenv('SELENIUM_PLATFORM') ? getenv('SELENIUM_PLATFORM') : 'http://localhost:4444/wd/hub'; + $this->seleniumUrl = getenv('SELENIUM_URL') ? getenv('SELENIUM_URL') : 'http://localhost:4444/wd/hub'; $this->url = getenv('SERVER_TEST') ? getenv('SERVER_TEST') : 'http://localhost:2000/'; + echo "SELENIUM_BROWSER = ".$this->browser."\n"; + echo "SELENIUM_VERSION = ".$this->capabilities['version']."\n"; + echo "SELENIUM_PLATFORM = ".$this->capabilities['platform']."\n"; + echo "SELENIUM_URL = ".$this->seleniumUrl."\n"; + echo "SERVER_TEST = ".$this->url."\n"; + $this->web_driver = new SystemWebDriver($this->seleniumUrl); $this->session = $this->getSession(); $this->session->deleteAllCookies(); From 32dc0176bc5b091091a79e8b613511eb5c923c6f Mon Sep 17 00:00:00 2001 From: Compass Date: Thu, 27 Feb 2014 23:05:13 -0800 Subject: [PATCH 49/91] Separate integration and unit test task --- build.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.xml b/build.xml index 170fec3e4..58ad6a89f 100644 --- a/build.xml +++ b/build.xml @@ -234,6 +234,11 @@ + + + + + From 84e37a379174c5b7effc2a91f97b375a884c4922 Mon Sep 17 00:00:00 2001 From: Compass Date: Thu, 27 Feb 2014 23:47:59 -0800 Subject: [PATCH 50/91] Add exception output when test failed to run --- app/vendors/shells/testreport.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/vendors/shells/testreport.php b/app/vendors/shells/testreport.php index 07219966c..c21296e39 100644 --- a/app/vendors/shells/testreport.php +++ b/app/vendors/shells/testreport.php @@ -72,7 +72,7 @@ public function __run() } } catch (Exception $e) { ob_get_clean(); - $this->out('Unit tests failed to run.'); + $this->out('Tests failed to run. ' . $e->getMessage()); $this->_stop(1); } $xml = ob_get_clean(); From 1a8790a0edb3ec3072021c62ee35ac69f51885a2 Mon Sep 17 00:00:00 2001 From: Compass Date: Fri, 28 Feb 2014 00:10:02 -0800 Subject: [PATCH 51/91] Fix the wrong environment variable usage --- app/tests/cases/system/system_base.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/tests/cases/system/system_base.php b/app/tests/cases/system/system_base.php index 65cba1a9c..e848ba4fb 100644 --- a/app/tests/cases/system/system_base.php +++ b/app/tests/cases/system/system_base.php @@ -27,14 +27,18 @@ public function __construct() $this->browser = getenv('SELENIUM_BROWSER') ? getenv('SELENIUM_BROWSER') : 'firefox'; $this->capabilities['platform'] = getenv('SELENIUM_PLATFORM') ? getenv('SELENIUM_PLATFORM') : 'ANY'; $this->capabilities['version'] = getenv('SELENIUM_VERSION') ? getenv('SELENIUM_VERSION') : ''; - $this->seleniumUrl = getenv('SELENIUM_URL') ? getenv('SELENIUM_URL') : 'http://localhost:4444/wd/hub'; + $host = getenv('SELENIUM_HOST') ? getenv('SELENIUM_HOST') : 'localhost'; + $port = getenv('SELENIUM_PORT') ? getenv('SELENIUM_PORT') : '4444'; + $username = getenv('SAUCE_USER_NAME') ? getenv('SAUCE_USER_NAME') : ''; + $apikey = getenv('SAUCE_API_KEY') ? ':'.getenv('SAUCE_API_KEY').'@' : ''; + $this->seleniumUrl = "http://".$username.$apikey.$host.':'.$port.'/wd/hub'; $this->url = getenv('SERVER_TEST') ? getenv('SERVER_TEST') : 'http://localhost:2000/'; - echo "SELENIUM_BROWSER = ".$this->browser."\n"; + /*echo "SELENIUM_BROWSER = ".$this->browser."\n"; echo "SELENIUM_VERSION = ".$this->capabilities['version']."\n"; echo "SELENIUM_PLATFORM = ".$this->capabilities['platform']."\n"; echo "SELENIUM_URL = ".$this->seleniumUrl."\n"; - echo "SERVER_TEST = ".$this->url."\n"; + echo "SERVER_TEST = ".$this->url."\n";*/ $this->web_driver = new SystemWebDriver($this->seleniumUrl); $this->session = $this->getSession(); From c232af811e84df8657caba0d5f5e2c8836cb85ea Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Fri, 28 Feb 2014 14:45:08 -0800 Subject: [PATCH 52/91] fixed bugs in saving mixeval evaluation details There were two bugs when saving mixeval evaluation details. The first one is trying to answer a likert question with a level of mastery of zero. If zero is selected, the answer would not be saved. The reason was likert questions answers are checked for validity before proceeding by checking whether the "selected_lom" attribute is "empty". However in php empty( 0 ) returns true, therefore the answer is ignored. This has now been fixed. Secondly, events that use mixeval templates that set the lowest level of mastery to zero marks do not save correctly. The grade saved does not take into account the lowest LOM is zero. In other words, it is calculated as if the "zero_mark" attribute is false. I have also update the readme documentation regarding Vagrant. --- app/controllers/components/evaluation.php | 17 ++++++++------- readme.md | 25 ++++++++++++++--------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/app/controllers/components/evaluation.php b/app/controllers/components/evaluation.php index dc318f352..576bfc8a4 100644 --- a/app/controllers/components/evaluation.php +++ b/app/controllers/components/evaluation.php @@ -986,18 +986,22 @@ function saveNGetEvaluationMixevalDetail($evalMixevalId, $mixeval, $form) } $evalMixevalDetail['EvaluationMixevalDetail']['evaluation_mixeval_id'] = $evalMixevalId; $evalMixevalDetail['EvaluationMixevalDetail']['question_number'] = $num; - + if (in_array($ques['mixeval_question_type_id'], array('1','4'))) { - if (empty($data[$num]['selected_lom']) && $ques['mixeval_question_type_id'] != '4' ) { + if (empty($data[$num]['selected_lom']) && $data[$num]['selected_lom'] != 0 && $ques['mixeval_question_type_id'] != '4' ) { continue; } if ($ques['mixeval_question_type_id'] == '1') { - $evalMixevalDetail['EvaluationMixevalDetail']['selected_lom'] = $data[$num]['selected_lom']; + $evalMixevalDetail['EvaluationMixevalDetail']['selected_lom'] = $data[$num]['selected_lom']; + // Do not grab grade directly as users can edit the HTML to submit illegitimate answers + $grade = $data[$num]['selected_lom'] * ($ques['multiplier']/($ques['scale_level'] - $mixeval['Mixeval']['zero_mark'])); + } else { + // if the question type is 4 - simply grab the grade + $evalMixevalDetail['EvaluationMixevalDetail']['grade'] = $data[$num]['grade']; } - // Do not grab grade directly as users can edit the HTML to submit illegitimate answers - $evalMixevalDetail['EvaluationMixevalDetail']['grade'] = $data[$num]['selected_lom'] * ($ques['multiplier']/$ques['scale_level']); + $evalMixevalDetail['EvaluationMixevalDetail']['grade'] = $data[$num]['grade']; if ($ques['required'] && !$ques['self_eval']) { - $totalGrade += $data[$num]['grade']; + $totalGrade += $evalMixevalDetail['EvaluationMixevalDetail']['grade']; } } else { if (empty($data[$num]['question_comment']) && !empty($evalMixevalDetail)) { @@ -1008,7 +1012,6 @@ function saveNGetEvaluationMixevalDetail($evalMixevalId, $mixeval, $form) } $evalMixevalDetail['EvaluationMixevalDetail']['question_comment'] = $data[$num]['question_comment']; } - $this->EvaluationMixevalDetail->save($evalMixevalDetail); $this->EvaluationMixevalDetail->id=null; } diff --git a/readme.md b/readme.md index c67a7366e..212df6641 100644 --- a/readme.md +++ b/readme.md @@ -5,23 +5,28 @@ Virtual Environment Setup: 1. Install VirtualBox at http://virtualbox.org 2. Install Vagrant at http://www.vagrantup.com/downloads 3. Go to the iPeer root directory in the terminal. Then run the following commands: - git submodule init - git submodule update - vagrant box add ipeerbox http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box - vagrant plugin install vagrant-vbguest - vagrant up + + git submodule init + git submodule update + vagrant box add ipeerbox http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box + vagrant plugin install vagrant-vbguest + vagrant up 4. Go to localhost:2000 in your browser. -Using a different port (must be the same port number in the virtual and host environment): +Using a different port (the port number must be available on both the virtual and host environment): 1. change the line in file puppet/dev.pp from - port => 2000, + + port => 2000, to (eg. port 8888) - port => 8888, + + port => 8888, 2. AND change the line in file app/tests/cases/controllers/v1_controller.test.php from - $server = 'http://localhost:2000'; + + $server = 'http://localhost:2000'; to - $server = 'http://localhost:8888'; + + $server = 'http://localhost:8888'; Running Tests: From aeb33038b84e6fdd278dd29833238059ee012e6a Mon Sep 17 00:00:00 2001 From: Compass Date: Fri, 28 Feb 2014 23:14:53 -0800 Subject: [PATCH 53/91] Add default test name to Selenium test --- app/tests/cases/system/system_base.php | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/app/tests/cases/system/system_base.php b/app/tests/cases/system/system_base.php index e848ba4fb..99beb83ae 100644 --- a/app/tests/cases/system/system_base.php +++ b/app/tests/cases/system/system_base.php @@ -25,6 +25,7 @@ public function __construct() // set up the test environment according to the environment values $this->browser = getenv('SELENIUM_BROWSER') ? getenv('SELENIUM_BROWSER') : 'firefox'; + $this->capabilities['name'] = get_class(this); $this->capabilities['platform'] = getenv('SELENIUM_PLATFORM') ? getenv('SELENIUM_PLATFORM') : 'ANY'; $this->capabilities['version'] = getenv('SELENIUM_VERSION') ? getenv('SELENIUM_VERSION') : ''; $host = getenv('SELENIUM_HOST') ? getenv('SELENIUM_HOST') : 'localhost'; @@ -41,18 +42,33 @@ public function __construct() echo "SERVER_TEST = ".$this->url."\n";*/ $this->web_driver = new SystemWebDriver($this->seleniumUrl); - $this->session = $this->getSession(); - $this->session->deleteAllCookies(); } public function getSession($new = false) { if ($this->session == null || $new == true) { - return $this->web_driver->session($this->browser, $this->capabilities); + $this->session = $this->web_driver->session($this->browser, $this->capabilities); + $this->session->deleteAllCookies(); + return $this->session; } else { return $this->session; } } + public function setSessionName($name) + { + $this->capabilities['name'] = $name; + } + + public function setBuildNumber($build) + { + $this->capabilities['build'] = $build; + } + + public function setTags($tags) + { + $this->capabilities['tags'] = $tags; + } + public function waitForLogoutLogin($username) { $this->session->open($this->url); From 3d63c69f6ef5c7b8eccc624819e4346b5c5503dc Mon Sep 17 00:00:00 2001 From: Compass Date: Fri, 28 Feb 2014 23:21:00 -0800 Subject: [PATCH 54/91] Fix a typo from previous commit --- app/tests/cases/system/system_base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tests/cases/system/system_base.php b/app/tests/cases/system/system_base.php index 99beb83ae..598689541 100644 --- a/app/tests/cases/system/system_base.php +++ b/app/tests/cases/system/system_base.php @@ -25,7 +25,7 @@ public function __construct() // set up the test environment according to the environment values $this->browser = getenv('SELENIUM_BROWSER') ? getenv('SELENIUM_BROWSER') : 'firefox'; - $this->capabilities['name'] = get_class(this); + $this->capabilities['name'] = get_class($this); $this->capabilities['platform'] = getenv('SELENIUM_PLATFORM') ? getenv('SELENIUM_PLATFORM') : 'ANY'; $this->capabilities['version'] = getenv('SELENIUM_VERSION') ? getenv('SELENIUM_VERSION') : ''; $host = getenv('SELENIUM_HOST') ? getenv('SELENIUM_HOST') : 'localhost'; From 9de9a8a0bdefec9b4e36be98383b834a773e96eb Mon Sep 17 00:00:00 2001 From: Compass Date: Sat, 1 Mar 2014 11:17:54 -0800 Subject: [PATCH 55/91] Add prepare task before integration test Prepare task is need to create necessary directories. --- build.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.xml b/build.xml index 58ad6a89f..66e76c819 100644 --- a/build.xml +++ b/build.xml @@ -214,27 +214,27 @@ - + - + - + - + - + - + From 41a81c68bf90ae1889cad9a919856340430a9bf9 Mon Sep 17 00:00:00 2001 From: Compass Date: Sun, 2 Mar 2014 01:02:26 -0800 Subject: [PATCH 56/91] Add sausage submodule and additional info for tests --- .gitmodules | 3 ++ app/tests/cases/system/SystemWebDriver.php | 6 +++- .../cases/system/SystemWebDriverSession.php | 2 ++ app/tests/cases/system/add_course.test.php | 6 ---- app/tests/cases/system/system_base.php | 28 +++++++++++++++++++ vendors/sausage | 1 + 6 files changed, 39 insertions(+), 7 deletions(-) create mode 160000 vendors/sausage diff --git a/.gitmodules b/.gitmodules index 28967518d..3e97851be 100644 --- a/.gitmodules +++ b/.gitmodules @@ -40,3 +40,6 @@ [submodule "vendors/webdriver"] path = vendors/webdriver url = https://github.com/Element-34/php-webdriver.git +[submodule "vendors/sausage"] + path = vendors/sausage + url = https://github.com/jlipps/sausage.git diff --git a/app/tests/cases/system/SystemWebDriver.php b/app/tests/cases/system/SystemWebDriver.php index f6247254e..0a527cc38 100644 --- a/app/tests/cases/system/SystemWebDriver.php +++ b/app/tests/cases/system/SystemWebDriver.php @@ -4,6 +4,7 @@ /** * SystemWebDriver This class is a duplication of WebDriver class in order to return a custom session object, which extends a few methods based on WebDriverSession class + * This class also stores session id in SystemWebDriverSession * * @uses PHPWebDriver_WebDriver * @package tests @@ -39,6 +40,9 @@ public function session($browser = 'firefox', array('desiredCapabilities' => $desired_capabilities), $curl_opts); - return new SystemWebDriverSession($results['info']['url'].$results['sessionId']); + $session = new SystemWebDriverSession($results['info']['url'].$results['sessionId']); + $session->id = $results['sessionId']; + + return $session; } } diff --git a/app/tests/cases/system/SystemWebDriverSession.php b/app/tests/cases/system/SystemWebDriverSession.php index f2d6d162c..828455751 100644 --- a/app/tests/cases/system/SystemWebDriverSession.php +++ b/app/tests/cases/system/SystemWebDriverSession.php @@ -4,6 +4,8 @@ require_once(VENDORS.'webdriver/PHPWebDriver/WebDriverContainer.php'); class SystemWebDriverSession extends PHPWebDriver_WebDriverSession { + protected $id; + public function elementWithWait($using, $value) { $selector = array('selector' => $using, 'value' => $value); $w = new PHPWebDriver_WebDriverWait($this, 30, 0.5, $selector); diff --git a/app/tests/cases/system/add_course.test.php b/app/tests/cases/system/add_course.test.php index 341e4fafd..9de68dbe0 100644 --- a/app/tests/cases/system/add_course.test.php +++ b/app/tests/cases/system/add_course.test.php @@ -12,12 +12,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->getSession()->deleteAllCookies(); - $this->getSession()->close(); - } - public function testAddCourse() { $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); diff --git a/app/tests/cases/system/system_base.php b/app/tests/cases/system/system_base.php index 598689541..c140e910f 100644 --- a/app/tests/cases/system/system_base.php +++ b/app/tests/cases/system/system_base.php @@ -6,6 +6,10 @@ require_once(VENDORS.'webdriver/PHPWebDriver/WebDriverWait.php'); require_once(VENDORS.'webdriver/PHPWebDriver/WebDriverKeys.php'); require_once(VENDORS.'webdriver/PHPWebDriver/WebDriverSession.php'); +require_once(VENDORS.'sausage/src/Sauce/Sausage/SauceConfig.php'); +require_once(VENDORS.'sausage/src/Sauce/Sausage/SauceAPI.php'); +require_once(VENDORS.'sausage/src/Sauce/Sausage/SauceMethods.php'); +require_once(VENDORS.'sausage/src/Sauce/Sausage/SauceTestCommon.php'); require_once('PageFactory.php'); class SystemBaseTestCase extends CakeTestCase @@ -26,8 +30,25 @@ public function __construct() // set up the test environment according to the environment values $this->browser = getenv('SELENIUM_BROWSER') ? getenv('SELENIUM_BROWSER') : 'firefox'; $this->capabilities['name'] = get_class($this); + $this->capabilities['build'] = getenv('BUILD_NUMBER'); $this->capabilities['platform'] = getenv('SELENIUM_PLATFORM') ? getenv('SELENIUM_PLATFORM') : 'ANY'; $this->capabilities['version'] = getenv('SELENIUM_VERSION') ? getenv('SELENIUM_VERSION') : ''; + + // get the repo info + $release = `git describe --tags`; + if (!$release) { + $release = "Unknown"; + } + $branch = `git rev-parse --abbrev-ref HEAD`; + if (!$branch) { + $branch = "Unknown"; + } + $commit = `git describe --tags --always`; + if (!$commit) { + $commit = "Unknown"; + } + $this->capabilities['custom-data'] = array('release' => $release, 'commit' => $commit, 'branch' => $branch); + $host = getenv('SELENIUM_HOST') ? getenv('SELENIUM_HOST') : 'localhost'; $port = getenv('SELENIUM_PORT') ? getenv('SELENIUM_PORT') : '4444'; $username = getenv('SAUCE_USER_NAME') ? getenv('SAUCE_USER_NAME') : ''; @@ -97,4 +118,11 @@ public function startTest($method) { public function endTest($method) { echo 'Ending method ' . $method . "\n"; } + + public function endCase() + { + SauceTestCommon::ReportStatus($this->getSession()->id, $reporter->getStatus()); + $this->getSession()->deleteAllCookies(); + $this->getSession()->close(); + } } diff --git a/vendors/sausage b/vendors/sausage new file mode 160000 index 000000000..0ab1a8353 --- /dev/null +++ b/vendors/sausage @@ -0,0 +1 @@ +Subproject commit 0ab1a83531f44718247eac2d615ad453489fe61e From ce79679378f732c3aba7a930dd9ea366019b9171 Mon Sep 17 00:00:00 2001 From: Compass Date: Sun, 2 Mar 2014 12:12:52 -0800 Subject: [PATCH 57/91] Remove SystemBaseTestCase being tested SimpleTest will load all the classes that included in the test file, including the base classes. But will ignore the abstract class from tests Also added more info for SauceLabs --- app/{tests/cases/system => libs}/PageFactory.php | 2 +- app/{tests/cases/system => libs}/SystemWebDriver.php | 2 +- .../cases/system => libs}/SystemWebDriverSession.php | 10 ++++++++++ app/{tests/cases/system => libs}/system_base.php | 12 +++++------- app/tests/cases/system/add_course.test.php | 2 +- app/tests/cases/system/add_event.test.php | 2 +- app/tests/cases/system/add_group.test.php | 2 +- app/tests/cases/system/add_mixeval.test.php | 2 +- app/tests/cases/system/add_rubric.test.php | 2 +- app/tests/cases/system/add_simple.test.php | 2 +- app/tests/cases/system/add_survey.test.php | 2 +- app/tests/cases/system/auto_create_groups.test.php | 2 +- app/tests/cases/system/enrol_student.test.php | 2 +- app/tests/cases/system/home.test.php | 2 +- app/tests/cases/system/import_groups.test.php | 2 +- app/tests/cases/system/import_users.test.php | 2 +- app/tests/cases/system/login.test.php | 2 +- app/tests/cases/system/mass_move.test.php | 2 +- app/tests/cases/system/merge_users.test.php | 2 +- app/tests/cases/system/move_student.test.php | 2 +- app/tests/cases/system/oauth_client.test.php | 2 +- app/tests/cases/system/oauth_token.test.php | 2 +- app/tests/cases/system/permissions_editor.test.php | 2 +- app/tests/cases/system/student_mixeval.test.php | 2 +- app/tests/cases/system/student_rubric.test.php | 2 +- app/tests/cases/system/student_simple.test.php | 2 +- app/tests/cases/system/student_survey.test.php | 2 +- app/tests/groups/system.group.php | 2 +- 28 files changed, 41 insertions(+), 33 deletions(-) rename app/{tests/cases/system => libs}/PageFactory.php (93%) rename app/{tests/cases/system => libs}/SystemWebDriver.php (97%) rename app/{tests/cases/system => libs}/SystemWebDriverSession.php (89%) rename app/{tests/cases/system => libs}/system_base.php (92%) diff --git a/app/tests/cases/system/PageFactory.php b/app/libs/PageFactory.php similarity index 93% rename from app/tests/cases/system/PageFactory.php rename to app/libs/PageFactory.php index 114f5e628..c2a138072 100644 --- a/app/tests/cases/system/PageFactory.php +++ b/app/libs/PageFactory.php @@ -3,7 +3,7 @@ class PageFactory { public static function initElements($session, $page) { - require_once('pages/'.$page.'Page.php'); + require_once(TESTS.'cases/system/pages/'.$page.'Page.php'); $className = $page.'Page'; $pageObject = new $className($session); diff --git a/app/tests/cases/system/SystemWebDriver.php b/app/libs/SystemWebDriver.php similarity index 97% rename from app/tests/cases/system/SystemWebDriver.php rename to app/libs/SystemWebDriver.php index 0a527cc38..ecf61a1e7 100644 --- a/app/tests/cases/system/SystemWebDriver.php +++ b/app/libs/SystemWebDriver.php @@ -41,7 +41,7 @@ public function session($browser = 'firefox', $curl_opts); $session = new SystemWebDriverSession($results['info']['url'].$results['sessionId']); - $session->id = $results['sessionId']; + $session->setId($results['sessionId']); return $session; } diff --git a/app/tests/cases/system/SystemWebDriverSession.php b/app/libs/SystemWebDriverSession.php similarity index 89% rename from app/tests/cases/system/SystemWebDriverSession.php rename to app/libs/SystemWebDriverSession.php index 828455751..4bebd7632 100644 --- a/app/tests/cases/system/SystemWebDriverSession.php +++ b/app/libs/SystemWebDriverSession.php @@ -6,6 +6,16 @@ class SystemWebDriverSession extends PHPWebDriver_WebDriverSession { protected $id; + public function getId() + { + return $this->id; + } + + public function setId($id) + { + $this->id = $id; + } + public function elementWithWait($using, $value) { $selector = array('selector' => $using, 'value' => $value); $w = new PHPWebDriver_WebDriverWait($this, 30, 0.5, $selector); diff --git a/app/tests/cases/system/system_base.php b/app/libs/system_base.php similarity index 92% rename from app/tests/cases/system/system_base.php rename to app/libs/system_base.php index c140e910f..b6998d16c 100644 --- a/app/tests/cases/system/system_base.php +++ b/app/libs/system_base.php @@ -12,7 +12,7 @@ require_once(VENDORS.'sausage/src/Sauce/Sausage/SauceTestCommon.php'); require_once('PageFactory.php'); -class SystemBaseTestCase extends CakeTestCase +abstract class SystemBaseTestCase extends CakeTestCase { protected $web_driver; protected $session = null; @@ -35,10 +35,6 @@ public function __construct() $this->capabilities['version'] = getenv('SELENIUM_VERSION') ? getenv('SELENIUM_VERSION') : ''; // get the repo info - $release = `git describe --tags`; - if (!$release) { - $release = "Unknown"; - } $branch = `git rev-parse --abbrev-ref HEAD`; if (!$branch) { $branch = "Unknown"; @@ -47,7 +43,7 @@ public function __construct() if (!$commit) { $commit = "Unknown"; } - $this->capabilities['custom-data'] = array('release' => $release, 'commit' => $commit, 'branch' => $branch); + $this->capabilities['custom-data'] = array('commit' => $commit, 'branch' => $branch); $host = getenv('SELENIUM_HOST') ? getenv('SELENIUM_HOST') : 'localhost'; $port = getenv('SELENIUM_PORT') ? getenv('SELENIUM_PORT') : '4444'; @@ -121,7 +117,9 @@ public function endTest($method) { public function endCase() { - SauceTestCommon::ReportStatus($this->getSession()->id, $reporter->getStatus()); + if (isset($this->reporter)) { + \Sauce\Sausage\SauceTestCommon::ReportStatus($this->getSession()->getId(), $this->reporter->getStatus()); + } $this->getSession()->deleteAllCookies(); $this->getSession()->close(); } diff --git a/app/tests/cases/system/add_course.test.php b/app/tests/cases/system/add_course.test.php index 9de68dbe0..492bd57e1 100644 --- a/app/tests/cases/system/add_course.test.php +++ b/app/tests/cases/system/add_course.test.php @@ -1,5 +1,5 @@ Date: Sun, 2 Mar 2014 14:07:42 -0800 Subject: [PATCH 58/91] Add test result feedback to SauceLabs --- app/libs/system_base.php | 4 ++-- app/tests/cases/system/add_event.test.php | 6 ------ app/tests/cases/system/add_group.test.php | 6 ------ app/tests/cases/system/add_mixeval.test.php | 6 ------ app/tests/cases/system/add_rubric.test.php | 6 ------ app/tests/cases/system/add_simple.test.php | 6 ------ app/tests/cases/system/add_survey.test.php | 5 ----- app/tests/cases/system/auto_create_groups.test.php | 6 ------ app/tests/cases/system/enrol_student.test.php | 6 ------ app/tests/cases/system/home.test.php | 6 ------ app/tests/cases/system/import_groups.test.php | 6 ------ app/tests/cases/system/import_users.test.php | 6 ------ app/tests/cases/system/login.test.php | 6 ------ app/tests/cases/system/mass_move.test.php | 6 ------ app/tests/cases/system/merge_users.test.php | 6 ------ app/tests/cases/system/move_student.test.php | 6 ------ app/tests/cases/system/oauth_client.test.php | 6 ------ app/tests/cases/system/oauth_token.test.php | 6 ------ app/tests/cases/system/permissions_editor.test.php | 6 ------ app/tests/cases/system/student_mixeval.test.php | 6 ------ app/tests/cases/system/student_rubric.test.php | 6 ------ app/tests/cases/system/student_simple.test.php | 6 ------ app/tests/cases/system/student_survey.test.php | 6 ------ 23 files changed, 2 insertions(+), 133 deletions(-) diff --git a/app/libs/system_base.php b/app/libs/system_base.php index b6998d16c..f207febeb 100644 --- a/app/libs/system_base.php +++ b/app/libs/system_base.php @@ -117,8 +117,8 @@ public function endTest($method) { public function endCase() { - if (isset($this->reporter)) { - \Sauce\Sausage\SauceTestCommon::ReportStatus($this->getSession()->getId(), $this->reporter->getStatus()); + if (getenv('SAUCE_USERNAME')) { + \Sauce\Sausage\SauceTestCommon::ReportStatus($this->getSession()->getId(), $this->_reporter->getStatus()); } $this->getSession()->deleteAllCookies(); $this->getSession()->close(); diff --git a/app/tests/cases/system/add_event.test.php b/app/tests/cases/system/add_event.test.php index fffd12c0d..05e57031d 100644 --- a/app/tests/cases/system/add_event.test.php +++ b/app/tests/cases/system/add_event.test.php @@ -12,12 +12,6 @@ public function startCase() $home = $login->login('instructor1', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testAddEvent() { $this->session->open($this->url.'events/add/1'); diff --git a/app/tests/cases/system/add_group.test.php b/app/tests/cases/system/add_group.test.php index b21e2b663..60f244196 100644 --- a/app/tests/cases/system/add_group.test.php +++ b/app/tests/cases/system/add_group.test.php @@ -14,12 +14,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testAddGroup() { $this->session->open($this->url.'courses/home/2'); diff --git a/app/tests/cases/system/add_mixeval.test.php b/app/tests/cases/system/add_mixeval.test.php index 5885133d3..61f024d30 100644 --- a/app/tests/cases/system/add_mixeval.test.php +++ b/app/tests/cases/system/add_mixeval.test.php @@ -15,12 +15,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testAddMixEval() { $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); diff --git a/app/tests/cases/system/add_rubric.test.php b/app/tests/cases/system/add_rubric.test.php index 0b317d472..51980a8df 100644 --- a/app/tests/cases/system/add_rubric.test.php +++ b/app/tests/cases/system/add_rubric.test.php @@ -14,12 +14,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testAddRubricErrors() { $this->session->open($this->url.'rubrics/add'); diff --git a/app/tests/cases/system/add_simple.test.php b/app/tests/cases/system/add_simple.test.php index 151612a1c..9ec9d3d2c 100644 --- a/app/tests/cases/system/add_simple.test.php +++ b/app/tests/cases/system/add_simple.test.php @@ -14,12 +14,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testAddError() { $this->session->open($this->url.'simpleevaluations/add'); diff --git a/app/tests/cases/system/add_survey.test.php b/app/tests/cases/system/add_survey.test.php index 6ac616898..10c136e3d 100644 --- a/app/tests/cases/system/add_survey.test.php +++ b/app/tests/cases/system/add_survey.test.php @@ -11,11 +11,6 @@ public function startCase() { $home = $login->login('root', 'ipeeripeer'); } - public function endCase() { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testAddSurvey() { $this->session->open($this->url.'surveys/add'); $this->session->elementWithWait(PHPWebDriver_WebDriverBy::ID, 'SurveyName')->sendKeys('grp making'); diff --git a/app/tests/cases/system/auto_create_groups.test.php b/app/tests/cases/system/auto_create_groups.test.php index cace50d38..3cce9673b 100644 --- a/app/tests/cases/system/auto_create_groups.test.php +++ b/app/tests/cases/system/auto_create_groups.test.php @@ -14,12 +14,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testErrorChecking() { $this->session->open($this->url.'surveygroups/makegroups/2'); diff --git a/app/tests/cases/system/enrol_student.test.php b/app/tests/cases/system/enrol_student.test.php index 6aee32058..c88ac572f 100644 --- a/app/tests/cases/system/enrol_student.test.php +++ b/app/tests/cases/system/enrol_student.test.php @@ -12,12 +12,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testEnrolStudent() { $this->session->open($this->url.'users/add/2'); diff --git a/app/tests/cases/system/home.test.php b/app/tests/cases/system/home.test.php index bcb28aea6..6d056fb53 100644 --- a/app/tests/cases/system/home.test.php +++ b/app/tests/cases/system/home.test.php @@ -12,12 +12,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testSuperAdmin() { $headers = $this->session->elementsWithWait(PHPWebDriver_WebDriverBy::TAG_NAME, 'h2'); diff --git a/app/tests/cases/system/import_groups.test.php b/app/tests/cases/system/import_groups.test.php index 09396e064..693731268 100644 --- a/app/tests/cases/system/import_groups.test.php +++ b/app/tests/cases/system/import_groups.test.php @@ -12,12 +12,6 @@ public function startCase() $home = $login->login('instructor2', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testImportGroupsError() { $this->session->open($this->url.'groups/import/2'); diff --git a/app/tests/cases/system/import_users.test.php b/app/tests/cases/system/import_users.test.php index 20a293102..fef53694a 100644 --- a/app/tests/cases/system/import_users.test.php +++ b/app/tests/cases/system/import_users.test.php @@ -12,12 +12,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testImportUsersError() { $this->session->open($this->url.'users/import/2'); diff --git a/app/tests/cases/system/login.test.php b/app/tests/cases/system/login.test.php index ce5c500cb..5b97ac92b 100644 --- a/app/tests/cases/system/login.test.php +++ b/app/tests/cases/system/login.test.php @@ -12,12 +12,6 @@ public function startCase() $this->getSession()->open($this->url); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function captureScreen($screenshot) { $filename = date('ymdHisu').'.png'; diff --git a/app/tests/cases/system/mass_move.test.php b/app/tests/cases/system/mass_move.test.php index eb441e434..f43e0c60e 100644 --- a/app/tests/cases/system/mass_move.test.php +++ b/app/tests/cases/system/mass_move.test.php @@ -15,12 +15,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testImportUsers() { $this->courseId = $this->addCourse('TEST 101 101'); diff --git a/app/tests/cases/system/merge_users.test.php b/app/tests/cases/system/merge_users.test.php index 4781822da..2471dc209 100644 --- a/app/tests/cases/system/merge_users.test.php +++ b/app/tests/cases/system/merge_users.test.php @@ -12,12 +12,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testAddUsers() { $title = $this->session->elementWithWait(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "h1.title")->text(); diff --git a/app/tests/cases/system/move_student.test.php b/app/tests/cases/system/move_student.test.php index a367ac14c..f98467d4d 100644 --- a/app/tests/cases/system/move_student.test.php +++ b/app/tests/cases/system/move_student.test.php @@ -14,12 +14,6 @@ public function startCase() $home = $login->login('admin1', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testAddSurveyEvent() { $this->session->elementWithWait(PHPWebDriver_WebDriverBy::LINK_TEXT, 'Courses')->click(); diff --git a/app/tests/cases/system/oauth_client.test.php b/app/tests/cases/system/oauth_client.test.php index e5bcb8458..dba479d7e 100644 --- a/app/tests/cases/system/oauth_client.test.php +++ b/app/tests/cases/system/oauth_client.test.php @@ -14,12 +14,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testAddOauthClient() { $this->session->open($this->url.'pages/admin'); diff --git a/app/tests/cases/system/oauth_token.test.php b/app/tests/cases/system/oauth_token.test.php index 0021a3efe..cfc50899c 100644 --- a/app/tests/cases/system/oauth_token.test.php +++ b/app/tests/cases/system/oauth_token.test.php @@ -14,12 +14,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testAddOauthToken() { $this->session->open($this->url.'pages/admin'); diff --git a/app/tests/cases/system/permissions_editor.test.php b/app/tests/cases/system/permissions_editor.test.php index 40eaed472..70a4cc7aa 100644 --- a/app/tests/cases/system/permissions_editor.test.php +++ b/app/tests/cases/system/permissions_editor.test.php @@ -12,12 +12,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testAllowAccess() { // access permission editor diff --git a/app/tests/cases/system/student_mixeval.test.php b/app/tests/cases/system/student_mixeval.test.php index d6dbdbfc1..04111d6d3 100644 --- a/app/tests/cases/system/student_mixeval.test.php +++ b/app/tests/cases/system/student_mixeval.test.php @@ -15,12 +15,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testCreateEvent() { $this->session->open($this->url.'events/add/1'); diff --git a/app/tests/cases/system/student_rubric.test.php b/app/tests/cases/system/student_rubric.test.php index 969c213c0..e7c6f57e9 100644 --- a/app/tests/cases/system/student_rubric.test.php +++ b/app/tests/cases/system/student_rubric.test.php @@ -14,12 +14,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testCreateEvent() { $this->session->open($this->url.'events/add/1'); diff --git a/app/tests/cases/system/student_simple.test.php b/app/tests/cases/system/student_simple.test.php index d447c5e58..e7d7b5dab 100644 --- a/app/tests/cases/system/student_simple.test.php +++ b/app/tests/cases/system/student_simple.test.php @@ -14,12 +14,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testCreateEvent() { $this->session->open($this->url.'events/add/1'); diff --git a/app/tests/cases/system/student_survey.test.php b/app/tests/cases/system/student_survey.test.php index 938eefb31..bbdd9d833 100644 --- a/app/tests/cases/system/student_survey.test.php +++ b/app/tests/cases/system/student_survey.test.php @@ -14,12 +14,6 @@ public function startCase() $home = $login->login('root', 'ipeeripeer'); } - public function endCase() - { - $this->session->deleteAllCookies(); - $this->session->close(); - } - public function testCreateEvent() { $this->session->open($this->url.'events/add/1'); From 91729324d3ca0fd9a10c393a72ac7c962c71bc86 Mon Sep 17 00:00:00 2001 From: Compass Date: Sun, 2 Mar 2014 14:14:03 -0800 Subject: [PATCH 59/91] Fix a typo --- app/libs/system_base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/libs/system_base.php b/app/libs/system_base.php index f207febeb..5c901f5b1 100644 --- a/app/libs/system_base.php +++ b/app/libs/system_base.php @@ -117,7 +117,7 @@ public function endTest($method) { public function endCase() { - if (getenv('SAUCE_USERNAME')) { + if (getenv('SAUCE_USER_NAME')) { \Sauce\Sausage\SauceTestCommon::ReportStatus($this->getSession()->getId(), $this->_reporter->getStatus()); } $this->getSession()->deleteAllCookies(); From e15ecc53032eceb8360824948ac85c4223859e0c Mon Sep 17 00:00:00 2001 From: Compass Date: Sun, 2 Mar 2014 17:09:38 -0800 Subject: [PATCH 60/91] Fix the incorrect test case status Using getFailCount and getExceptionCount to determine if the current test case has failed tests --- app/libs/system_base.php | 31 ++++++++++++++++++- app/tests/cases/system/add_course.test.php | 1 + app/tests/cases/system/add_event.test.php | 1 + app/tests/cases/system/add_group.test.php | 1 + app/tests/cases/system/add_mixeval.test.php | 1 + app/tests/cases/system/add_rubric.test.php | 1 + app/tests/cases/system/add_simple.test.php | 1 + app/tests/cases/system/add_survey.test.php | 4 ++- .../cases/system/auto_create_groups.test.php | 1 + app/tests/cases/system/enrol_student.test.php | 1 + app/tests/cases/system/home.test.php | 1 + app/tests/cases/system/import_groups.test.php | 1 + app/tests/cases/system/import_users.test.php | 1 + app/tests/cases/system/login.test.php | 1 + app/tests/cases/system/mass_move.test.php | 1 + app/tests/cases/system/merge_users.test.php | 1 + app/tests/cases/system/move_student.test.php | 1 + app/tests/cases/system/oauth_client.test.php | 1 + app/tests/cases/system/oauth_token.test.php | 1 + .../cases/system/permissions_editor.test.php | 1 + .../cases/system/student_mixeval.test.php | 1 + .../cases/system/student_rubric.test.php | 1 + .../cases/system/student_simple.test.php | 1 + .../cases/system/student_survey.test.php | 1 + 24 files changed, 55 insertions(+), 2 deletions(-) diff --git a/app/libs/system_base.php b/app/libs/system_base.php index 5c901f5b1..d8fbc8c48 100644 --- a/app/libs/system_base.php +++ b/app/libs/system_base.php @@ -20,6 +20,17 @@ abstract class SystemBaseTestCase extends CakeTestCase protected $browser; protected $capabilities; protected $seleniumUrl; + /** + * startFailCount record the failed test count before this test case start. + * Since SimpleTest and CakeTestCase doesn't provide any ability to tell if + * the current test case has failed tests, we have to compare the failed + * tests count at the before and after the test case run. + * + * @var int + * @access protected + */ + protected $startFailCount = 0; + protected $startExceptionCount = 0; public function __construct() { @@ -115,12 +126,30 @@ public function endTest($method) { echo 'Ending method ' . $method . "\n"; } + public function startCase() + { + $this->startFailCount = $this->_reporter->getFailCount(); + $this->startExceptionCount = $this->_reporter->getExceptionCount(); + } + public function endCase() { if (getenv('SAUCE_USER_NAME')) { - \Sauce\Sausage\SauceTestCommon::ReportStatus($this->getSession()->getId(), $this->_reporter->getStatus()); + \Sauce\Sausage\SauceTestCommon::ReportStatus($this->getSession()->getId(), !$this->isFailed()); } $this->getSession()->deleteAllCookies(); $this->getSession()->close(); } + + /** + * isFailed tell if the current case has failed tests + * + * @access public + * @return boolean if the case has failed tests + */ + public function isFailed() + { + return ($this->startFailCount != $this->_reporter->getFailCount()) + || ($this->startExceptionCount != $this->_reporter->getExceptionCount()); + } } diff --git a/app/tests/cases/system/add_course.test.php b/app/tests/cases/system/add_course.test.php index 492bd57e1..a47cc73e6 100644 --- a/app/tests/cases/system/add_course.test.php +++ b/app/tests/cases/system/add_course.test.php @@ -5,6 +5,7 @@ class AddCourseTestCase extends SystemBaseTestCase { public function startCase() { + parent::startCase(); echo "Start AddCourse system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/add_event.test.php b/app/tests/cases/system/add_event.test.php index 05e57031d..7fa0a09de 100644 --- a/app/tests/cases/system/add_event.test.php +++ b/app/tests/cases/system/add_event.test.php @@ -5,6 +5,7 @@ class addEventTestCase extends SystemBaseTestCase { public function startCase() { + parent::startCase(); echo "Start AddEvent system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/add_group.test.php b/app/tests/cases/system/add_group.test.php index 60f244196..3c370d282 100644 --- a/app/tests/cases/system/add_group.test.php +++ b/app/tests/cases/system/add_group.test.php @@ -7,6 +7,7 @@ class AddGroupTestCase extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start AddGroup system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/add_mixeval.test.php b/app/tests/cases/system/add_mixeval.test.php index 61f024d30..18ccb5733 100644 --- a/app/tests/cases/system/add_mixeval.test.php +++ b/app/tests/cases/system/add_mixeval.test.php @@ -8,6 +8,7 @@ class AddMixEvalTestCase extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start AddMixeval system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/add_rubric.test.php b/app/tests/cases/system/add_rubric.test.php index 51980a8df..a02e7b834 100644 --- a/app/tests/cases/system/add_rubric.test.php +++ b/app/tests/cases/system/add_rubric.test.php @@ -7,6 +7,7 @@ class addRubricTestCase extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start AddRubric system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/add_simple.test.php b/app/tests/cases/system/add_simple.test.php index 9ec9d3d2c..b712753b0 100644 --- a/app/tests/cases/system/add_simple.test.php +++ b/app/tests/cases/system/add_simple.test.php @@ -7,6 +7,7 @@ class addSimpleTestCase extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start AddSimple system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/add_survey.test.php b/app/tests/cases/system/add_survey.test.php index 10c136e3d..eca713a00 100644 --- a/app/tests/cases/system/add_survey.test.php +++ b/app/tests/cases/system/add_survey.test.php @@ -3,7 +3,9 @@ class addSurveyTestCase extends SystemBaseTestCase { - public function startCase() { + public function startCase() + { + parent::startCase(); echo "Start AddSurvey system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/auto_create_groups.test.php b/app/tests/cases/system/auto_create_groups.test.php index 3cce9673b..2ca15d0ba 100644 --- a/app/tests/cases/system/auto_create_groups.test.php +++ b/app/tests/cases/system/auto_create_groups.test.php @@ -7,6 +7,7 @@ class autoCreateGroupsTestCase extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start AutoCreateGroups system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/enrol_student.test.php b/app/tests/cases/system/enrol_student.test.php index c88ac572f..e45e041c3 100644 --- a/app/tests/cases/system/enrol_student.test.php +++ b/app/tests/cases/system/enrol_student.test.php @@ -5,6 +5,7 @@ class EnrolStudentTestCase extends SystemBaseTestCase { public function startCase() { + parent::startCase(); echo "Start EnrolStudent system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/home.test.php b/app/tests/cases/system/home.test.php index 6d056fb53..a9f437edd 100644 --- a/app/tests/cases/system/home.test.php +++ b/app/tests/cases/system/home.test.php @@ -5,6 +5,7 @@ class homeTestCase extends SystemBaseTestCase { public function startCase() { + parent::startCase(); echo "Start HomeTest system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/import_groups.test.php b/app/tests/cases/system/import_groups.test.php index 693731268..64c6c5862 100644 --- a/app/tests/cases/system/import_groups.test.php +++ b/app/tests/cases/system/import_groups.test.php @@ -5,6 +5,7 @@ class ImportGroupsTestCase extends SystemBaseTestCase { public function startCase() { + parent::startCase(); echo "Start ImportGroups system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/import_users.test.php b/app/tests/cases/system/import_users.test.php index fef53694a..6597e0a5e 100644 --- a/app/tests/cases/system/import_users.test.php +++ b/app/tests/cases/system/import_users.test.php @@ -5,6 +5,7 @@ class ImportUsersTestCase extends SystemBaseTestCase { public function startCase() { + parent::startCase(); echo "Start ImportUsers system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/login.test.php b/app/tests/cases/system/login.test.php index 5b97ac92b..20cc509ab 100644 --- a/app/tests/cases/system/login.test.php +++ b/app/tests/cases/system/login.test.php @@ -8,6 +8,7 @@ class LoginTestCase extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start Login system test.\n"; $this->getSession()->open($this->url); } diff --git a/app/tests/cases/system/mass_move.test.php b/app/tests/cases/system/mass_move.test.php index f43e0c60e..2f8af06f4 100644 --- a/app/tests/cases/system/mass_move.test.php +++ b/app/tests/cases/system/mass_move.test.php @@ -8,6 +8,7 @@ class massMoveTestCase extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start MassMove system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/merge_users.test.php b/app/tests/cases/system/merge_users.test.php index 2471dc209..6d10181ee 100644 --- a/app/tests/cases/system/merge_users.test.php +++ b/app/tests/cases/system/merge_users.test.php @@ -5,6 +5,7 @@ class MergeUsersTestCase extends SystemBaseTestCase { public function startCase() { + parent::startCase(); echo "Start MergeUsers system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/move_student.test.php b/app/tests/cases/system/move_student.test.php index f98467d4d..93b4e53bf 100644 --- a/app/tests/cases/system/move_student.test.php +++ b/app/tests/cases/system/move_student.test.php @@ -7,6 +7,7 @@ class MoveStudentTestCase extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start MoveStudent system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/oauth_client.test.php b/app/tests/cases/system/oauth_client.test.php index dba479d7e..1b682b169 100644 --- a/app/tests/cases/system/oauth_client.test.php +++ b/app/tests/cases/system/oauth_client.test.php @@ -7,6 +7,7 @@ class oauthClientTestCase extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start OauthClient system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/oauth_token.test.php b/app/tests/cases/system/oauth_token.test.php index cfc50899c..de5652276 100644 --- a/app/tests/cases/system/oauth_token.test.php +++ b/app/tests/cases/system/oauth_token.test.php @@ -7,6 +7,7 @@ class oauthTokenTestCase extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start OauthToken system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/permissions_editor.test.php b/app/tests/cases/system/permissions_editor.test.php index 70a4cc7aa..7df9bdc21 100644 --- a/app/tests/cases/system/permissions_editor.test.php +++ b/app/tests/cases/system/permissions_editor.test.php @@ -5,6 +5,7 @@ class PermissionsEditorTestCase extends SystemBaseTestCase { public function startCase() { + parent::startCase(); echo "Start PermissionsEditor system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/student_mixeval.test.php b/app/tests/cases/system/student_mixeval.test.php index 04111d6d3..c87de700b 100644 --- a/app/tests/cases/system/student_mixeval.test.php +++ b/app/tests/cases/system/student_mixeval.test.php @@ -8,6 +8,7 @@ class studentMixeval extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start StudentMixeval system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/student_rubric.test.php b/app/tests/cases/system/student_rubric.test.php index e7c6f57e9..54818b9bb 100644 --- a/app/tests/cases/system/student_rubric.test.php +++ b/app/tests/cases/system/student_rubric.test.php @@ -7,6 +7,7 @@ class studentRubric extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start StudentRubric system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/student_simple.test.php b/app/tests/cases/system/student_simple.test.php index e7d7b5dab..1d98d05b0 100644 --- a/app/tests/cases/system/student_simple.test.php +++ b/app/tests/cases/system/student_simple.test.php @@ -7,6 +7,7 @@ class studentSimple extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start StudentSimple system test.\n"; $this->getSession()->open($this->url); diff --git a/app/tests/cases/system/student_survey.test.php b/app/tests/cases/system/student_survey.test.php index bbdd9d833..161860814 100644 --- a/app/tests/cases/system/student_survey.test.php +++ b/app/tests/cases/system/student_survey.test.php @@ -7,6 +7,7 @@ class studentSurvey extends SystemBaseTestCase public function startCase() { + parent::startCase(); echo "Start StudentSurvey system test.\n"; $this->getSession()->open($this->url); From 2f13e01818825cb1518011854312715687f32120 Mon Sep 17 00:00:00 2001 From: Compass Date: Thu, 6 Mar 2014 11:31:08 -0800 Subject: [PATCH 61/91] Update iPeer puppet module to support local_config setup --- puppet/modules/ipeer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/puppet/modules/ipeer b/puppet/modules/ipeer index 96d91979d..53885d95f 160000 --- a/puppet/modules/ipeer +++ b/puppet/modules/ipeer @@ -1 +1 @@ -Subproject commit 96d91979d7734fa3f45d3243bc8f6bbf224650cc +Subproject commit 53885d95fc8a9f3262847d1604191057288b2b6a From fe16b5599a5cfc14505cce345495fbd27e1e2cea Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Fri, 7 Mar 2014 15:26:43 -0800 Subject: [PATCH 62/91] Ticket 560 - Super admins can reset passwords with emails sent out I have implemented the extension of resetting passwords, which is without sending out emails notifying the users affected. This extension can only be used by super amins currently. This restriction is impelemented with acl. This functionality can be accessed by super admins via the users index and the courses' class lists. I have also update the ipeer database scripts to include the new permissions. Furthermore, I have consolidated delta_8 into delta_7. --- app/config/core.php | 2 +- app/config/sql/delta_7.sql | 907 +++++++++++++------------- app/config/sql/delta_8.sql | 9 - app/config/sql/ipeer.sql | 898 ++++++++++++------------- app/config/sql/ipeer_samples_data.sql | 898 ++++++++++++------------- app/controllers/users_controller.php | 160 +++-- app/models/user.php | 22 + app/vendors/shells/create_acl.php | 2 + app/views/users/go_to_class_list.ctp | 11 +- 9 files changed, 1494 insertions(+), 1415 deletions(-) delete mode 100644 app/config/sql/delta_8.sql diff --git a/app/config/core.php b/app/config/core.php index 980692c41..dd705b1bd 100644 --- a/app/config/core.php +++ b/app/config/core.php @@ -319,7 +319,7 @@ /** * iPeer database version */ - Configure::write('DATABASE_VERSION', 8); + Configure::write('DATABASE_VERSION', 7); $CWL['LoginURL'] = 'https://www.auth.cwl.ubc.ca/auth/login'; diff --git a/app/config/sql/delta_7.sql b/app/config/sql/delta_7.sql index f352d6e04..838927a07 100644 --- a/app/config/sql/delta_7.sql +++ b/app/config/sql/delta_7.sql @@ -1,6 +1,6 @@ ---- ---- recreate the ACL ---- +-- +-- recreate the ACL +-- DROP TABLE IF EXISTS `acos`; CREATE TABLE IF NOT EXISTS `acos` ( `id` int(10) NOT NULL AUTO_INCREMENT, @@ -20,335 +20,337 @@ CREATE TABLE IF NOT EXISTS `acos` ( -- INSERT INTO acos (id, parent_id, model, foreign_key, alias, lft, rght) VALUES -(1,NULL,NULL,NULL,'adminpage',1,2), -(2,NULL,NULL,NULL,'controllers',3,594), -(3,2,NULL,NULL,'Pages',4,17), -(4,3,NULL,NULL,'display',5,6), -(5,3,NULL,NULL,'add',7,8), -(6,3,NULL,NULL,'edit',9,10), -(7,3,NULL,NULL,'index',11,12), -(8,3,NULL,NULL,'view',13,14), -(9,3,NULL,NULL,'delete',15,16), -(10,2,NULL,NULL,'Searchs',18,45), -(11,10,NULL,NULL,'update',19,20), -(12,10,NULL,NULL,'index',21,22), -(13,10,NULL,NULL,'searchEvaluation',23,24), -(14,10,NULL,NULL,'searchResult',25,26), -(15,10,NULL,NULL,'searchInstructor',27,28), -(16,10,NULL,NULL,'eventBoxSearch',29,30), -(17,10,NULL,NULL,'formatSearchEvaluation',31,32), -(18,10,NULL,NULL,'formatSearchInstructor',33,34), -(19,10,NULL,NULL,'formatSearchEvaluationResult',35,36), -(20,10,NULL,NULL,'add',37,38), -(21,10,NULL,NULL,'edit',39,40), -(22,10,NULL,NULL,'view',41,42), -(23,10,NULL,NULL,'delete',43,44), -(24,2,NULL,NULL,'Users',46,81), -(25,24,NULL,NULL,'ajaxList',47,48), -(26,24,NULL,NULL,'index',49,50), -(27,24,NULL,NULL,'goToClassList',51,52), -(28,24,NULL,NULL,'determineIfStudentFromThisData',53,54), -(29,24,NULL,NULL,'view',55,56), -(30,24,NULL,NULL,'add',57,58), -(31,24,NULL,NULL,'enrol',59,60), -(32,24,NULL,NULL,'edit',61,62), -(33,24,NULL,NULL,'editProfile',63,64), -(34,24,NULL,NULL,'delete',65,66), -(35,24,NULL,NULL,'checkDuplicateName',67,68), -(36,24,NULL,NULL,'resetPassword',69,70), -(37,24,NULL,NULL,'import',71,72), -(38,24,NULL,NULL,'merge',73,74), -(39,24,NULL,NULL,'ajax_merge',75,76), -(40,24,NULL,NULL,'update',77,78), -(41,24,NULL,NULL,'showEvents',79,80), -(42,2,NULL,NULL,'Oauthclients',82,93), -(43,42,NULL,NULL,'index',83,84), -(44,42,NULL,NULL,'add',85,86), -(45,42,NULL,NULL,'edit',87,88), -(46,42,NULL,NULL,'delete',89,90), -(47,42,NULL,NULL,'view',91,92), -(48,2,NULL,NULL,'Framework',94,109), -(49,48,NULL,NULL,'calendarDisplay',95,96), -(50,48,NULL,NULL,'tutIndex',97,98), -(51,48,NULL,NULL,'add',99,100), -(52,48,NULL,NULL,'edit',101,102), -(53,48,NULL,NULL,'index',103,104), -(54,48,NULL,NULL,'view',105,106), -(55,48,NULL,NULL,'delete',107,108), -(56,2,NULL,NULL,'Home',110,121), -(57,56,NULL,NULL,'index',111,112), -(58,56,NULL,NULL,'add',113,114), -(59,56,NULL,NULL,'edit',115,116), -(60,56,NULL,NULL,'view',117,118), -(61,56,NULL,NULL,'delete',119,120), -(62,2,NULL,NULL,'Accesses',122,133), -(63,62,NULL,NULL,'view',123,124), -(64,62,NULL,NULL,'edit',125,126), -(65,62,NULL,NULL,'add',127,128), -(66,62,NULL,NULL,'index',129,130), -(67,62,NULL,NULL,'delete',131,132), -(68,2,NULL,NULL,'Surveygroups',134,165), -(69,68,NULL,NULL,'postProcess',135,136), -(70,68,NULL,NULL,'setUpAjaxList',137,138), -(71,68,NULL,NULL,'index',139,140), -(72,68,NULL,NULL,'ajaxList',141,142), -(73,68,NULL,NULL,'makegroups',143,144), -(74,68,NULL,NULL,'makegroupssearch',145,146), -(75,68,NULL,NULL,'maketmgroups',147,148), -(76,68,NULL,NULL,'savegroups',149,150), -(77,68,NULL,NULL,'release',151,152), -(78,68,NULL,NULL,'delete',153,154), -(79,68,NULL,NULL,'edit',155,156), -(80,68,NULL,NULL,'changegroupset',157,158), -(81,68,NULL,NULL,'export',159,160), -(82,68,NULL,NULL,'add',161,162), -(83,68,NULL,NULL,'view',163,164), -(84,2,NULL,NULL,'Upgrade',166,179), -(85,84,NULL,NULL,'index',167,168), -(86,84,NULL,NULL,'step2',169,170), -(87,84,NULL,NULL,'add',171,172), -(88,84,NULL,NULL,'edit',173,174), -(89,84,NULL,NULL,'view',175,176), -(90,84,NULL,NULL,'delete',177,178), -(91,2,NULL,NULL,'Evaluations',180,219), -(92,91,NULL,NULL,'setUpAjaxList',181,182), -(93,91,NULL,NULL,'ajaxList',183,184), -(94,91,NULL,NULL,'view',185,186), -(95,91,NULL,NULL,'index',187,188), -(96,91,NULL,NULL,'export',189,190), -(97,91,NULL,NULL,'makeEvaluation',191,192), -(98,91,NULL,NULL,'completeEvaluationRubric',193,194), -(99,91,NULL,NULL,'viewEvaluationResults',195,196), -(100,91,NULL,NULL,'studentViewEvaluationResult',197,198), -(101,91,NULL,NULL,'markEventReviewed',199,200), -(102,91,NULL,NULL,'markGradeRelease',201,202), -(103,91,NULL,NULL,'markCommentRelease',203,204), -(104,91,NULL,NULL,'changeAllCommentRelease',205,206), -(105,91,NULL,NULL,'changeAllGradeRelease',207,208), -(106,91,NULL,NULL,'viewGroupSubmissionDetails',209,210), -(107,91,NULL,NULL,'viewSurveySummary',211,212), -(108,91,NULL,NULL,'add',213,214), -(109,91,NULL,NULL,'edit',215,216), -(110,91,NULL,NULL,'delete',217,218), -(111,2,NULL,NULL,'Oauthtokens',220,231), -(112,111,NULL,NULL,'index',221,222), -(113,111,NULL,NULL,'add',223,224), -(114,111,NULL,NULL,'edit',225,226), -(115,111,NULL,NULL,'delete',227,228), -(116,111,NULL,NULL,'view',229,230), -(117,2,NULL,NULL,'Evaltools',232,243), -(118,117,NULL,NULL,'index',233,234), -(119,117,NULL,NULL,'add',235,236), -(120,117,NULL,NULL,'edit',237,238), -(121,117,NULL,NULL,'view',239,240), -(122,117,NULL,NULL,'delete',241,242), -(123,2,NULL,NULL,'Penalty',244,257), -(124,123,NULL,NULL,'save',245,246), -(125,123,NULL,NULL,'add',247,248), -(126,123,NULL,NULL,'edit',249,250), -(127,123,NULL,NULL,'index',251,252), -(128,123,NULL,NULL,'view',253,254), -(129,123,NULL,NULL,'delete',255,256), -(130,2,NULL,NULL,'Groups',258,277), -(131,130,NULL,NULL,'setUpAjaxList',259,260), -(132,130,NULL,NULL,'index',261,262), -(133,130,NULL,NULL,'ajaxList',263,264), -(134,130,NULL,NULL,'view',265,266), -(135,130,NULL,NULL,'add',267,268), -(136,130,NULL,NULL,'edit',269,270), -(137,130,NULL,NULL,'delete',271,272), -(138,130,NULL,NULL,'import',273,274), -(139,130,NULL,NULL,'export',275,276), -(140,2,NULL,NULL,'Faculties',278,289), -(141,140,NULL,NULL,'index',279,280), -(142,140,NULL,NULL,'view',281,282), -(143,140,NULL,NULL,'add',283,284), -(144,140,NULL,NULL,'edit',285,286), -(145,140,NULL,NULL,'delete',287,288), -(146,2,NULL,NULL,'Rubrics',290,309), -(147,146,NULL,NULL,'postProcess',291,292), -(148,146,NULL,NULL,'setUpAjaxList',293,294), -(149,146,NULL,NULL,'index',295,296), -(150,146,NULL,NULL,'ajaxList',297,298), -(151,146,NULL,NULL,'view',299,300), -(152,146,NULL,NULL,'add',301,302), -(153,146,NULL,NULL,'edit',303,304), -(154,146,NULL,NULL,'copy',305,306), -(155,146,NULL,NULL,'delete',307,308), -(156,2,NULL,NULL,'Events',310,337), -(157,156,NULL,NULL,'postProcessData',311,312), -(158,156,NULL,NULL,'setUpAjaxList',313,314), -(159,156,NULL,NULL,'index',315,316), -(160,156,NULL,NULL,'ajaxList',317,318), -(161,156,NULL,NULL,'view',319,320), -(162,156,NULL,NULL,'add',321,322), -(163,156,NULL,NULL,'setSchedule',323,324), -(164,156,NULL,NULL,'getGroupMembers',325,326), -(165,156,NULL,NULL,'edit',327,328), -(166,156,NULL,NULL,'checkIfChanged',329,330), -(167,156,NULL,NULL,'calculateFrequency',331,332), -(168,156,NULL,NULL,'delete',333,334), -(169,156,NULL,NULL,'checkDuplicateName',335,336), -(170,2,NULL,NULL,'Simpleevaluations',338,357), -(171,170,NULL,NULL,'postProcess',339,340), -(172,170,NULL,NULL,'setUpAjaxList',341,342), -(173,170,NULL,NULL,'index',343,344), -(174,170,NULL,NULL,'ajaxList',345,346), -(175,170,NULL,NULL,'view',347,348), -(176,170,NULL,NULL,'add',349,350), -(177,170,NULL,NULL,'edit',351,352), -(178,170,NULL,NULL,'copy',353,354), -(179,170,NULL,NULL,'delete',355,356), -(180,2,NULL,NULL,'V1',358,393), -(181,180,NULL,NULL,'oauth',359,360), -(182,180,NULL,NULL,'oauth_error',361,362), -(183,180,NULL,NULL,'users',363,364), -(184,180,NULL,NULL,'courses',365,366), -(185,180,NULL,NULL,'groups',367,368), -(186,180,NULL,NULL,'groupMembers',369,370), -(187,180,NULL,NULL,'events',371,372), -(188,180,NULL,NULL,'grades',373,374), -(189,180,NULL,NULL,'departments',375,376), -(190,180,NULL,NULL,'courseDepartments',377,378), -(191,180,NULL,NULL,'userEvents',379,380), -(192,180,NULL,NULL,'enrolment',381,382), -(193,180,NULL,NULL,'add',383,384), -(194,180,NULL,NULL,'edit',385,386), -(195,180,NULL,NULL,'index',387,388), -(196,180,NULL,NULL,'view',389,390), -(197,180,NULL,NULL,'delete',391,392), -(198,2,NULL,NULL,'Departments',394,405), -(199,198,NULL,NULL,'index',395,396), -(200,198,NULL,NULL,'view',397,398), -(201,198,NULL,NULL,'add',399,400), -(202,198,NULL,NULL,'edit',401,402), -(203,198,NULL,NULL,'delete',403,404), -(204,2,NULL,NULL,'Sysparameters',406,421), -(205,204,NULL,NULL,'setUpAjaxList',407,408), -(206,204,NULL,NULL,'index',409,410), -(207,204,NULL,NULL,'ajaxList',411,412), -(208,204,NULL,NULL,'view',413,414), -(209,204,NULL,NULL,'add',415,416), -(210,204,NULL,NULL,'edit',417,418), -(211,204,NULL,NULL,'delete',419,420), -(212,2,NULL,NULL,'Mixevals',422,439), -(213,212,NULL,NULL,'setUpAjaxList',423,424), -(214,212,NULL,NULL,'index',425,426), -(215,212,NULL,NULL,'ajaxList',427,428), -(216,212,NULL,NULL,'view',429,430), -(217,212,NULL,NULL,'add',431,432), -(218,212,NULL,NULL,'edit',433,434), -(219,212,NULL,NULL,'copy',435,436), -(220,212,NULL,NULL,'delete',437,438), -(221,2,NULL,NULL,'Emailtemplates',440,459), -(222,221,NULL,NULL,'setUpAjaxList',441,442), -(223,221,NULL,NULL,'ajaxList',443,444), -(224,221,NULL,NULL,'index',445,446), -(225,221,NULL,NULL,'add',447,448), -(226,221,NULL,NULL,'edit',449,450), -(227,221,NULL,NULL,'delete',451,452), -(228,221,NULL,NULL,'view',453,454), -(229,221,NULL,NULL,'displayTemplateContent',455,456), -(230,221,NULL,NULL,'displayTemplateSubject',457,458), -(231,2,NULL,NULL,'Install',460,481), -(232,231,NULL,NULL,'index',461,462), -(233,231,NULL,NULL,'install2',463,464), -(234,231,NULL,NULL,'install3',465,466), -(235,231,NULL,NULL,'install4',467,468), -(236,231,NULL,NULL,'install5',469,470), -(237,231,NULL,NULL,'gpl',471,472), -(238,231,NULL,NULL,'add',473,474), -(239,231,NULL,NULL,'edit',475,476), -(240,231,NULL,NULL,'view',477,478), -(241,231,NULL,NULL,'delete',479,480), -(242,2,NULL,NULL,'Courses',482,505), -(243,242,NULL,NULL,'daysLate',483,484), -(244,242,NULL,NULL,'index',485,486), -(245,242,NULL,NULL,'ajaxList',487,488), -(246,242,NULL,NULL,'view',489,490), -(247,242,NULL,NULL,'home',491,492), -(248,242,NULL,NULL,'add',493,494), -(249,242,NULL,NULL,'edit',495,496), -(250,242,NULL,NULL,'delete',497,498), -(251,242,NULL,NULL,'move',499,500), -(252,242,NULL,NULL,'ajax_options',501,502), -(253,242,NULL,NULL,'import',503,504), -(254,2,NULL,NULL,'Surveys',506,535), -(255,254,NULL,NULL,'setUpAjaxList',507,508), -(256,254,NULL,NULL,'index',509,510), -(257,254,NULL,NULL,'ajaxList',511,512), -(258,254,NULL,NULL,'view',513,514), -(259,254,NULL,NULL,'add',515,516), -(260,254,NULL,NULL,'edit',517,518), -(261,254,NULL,NULL,'copy',519,520), -(262,254,NULL,NULL,'delete',521,522), -(263,254,NULL,NULL,'questionsSummary',523,524), -(264,254,NULL,NULL,'moveQuestion',525,526), -(265,254,NULL,NULL,'removeQuestion',527,528), -(266,254,NULL,NULL,'addQuestion',529,530), -(267,254,NULL,NULL,'editQuestion',531,532), -(268,254,NULL,NULL,'surveyAccess',533,534), -(269,2,NULL,NULL,'Lti',536,547), -(270,269,NULL,NULL,'index',537,538), -(271,269,NULL,NULL,'add',539,540), -(272,269,NULL,NULL,'edit',541,542), -(273,269,NULL,NULL,'view',543,544), -(274,269,NULL,NULL,'delete',545,546), -(275,2,NULL,NULL,'Emailer',548,575), -(276,275,NULL,NULL,'setUpAjaxList',549,550), -(277,275,NULL,NULL,'ajaxList',551,552), -(278,275,NULL,NULL,'index',553,554), -(279,275,NULL,NULL,'write',555,556), -(280,275,NULL,NULL,'cancel',557,558), -(281,275,NULL,NULL,'view',559,560), -(282,275,NULL,NULL,'addRecipient',561,562), -(283,275,NULL,NULL,'deleteRecipient',563,564), -(284,275,NULL,NULL,'getRecipient',565,566), -(285,275,NULL,NULL,'searchByUserId',567,568), -(286,275,NULL,NULL,'add',569,570), -(287,275,NULL,NULL,'edit',571,572), -(288,275,NULL,NULL,'delete',573,574), -(289,2,NULL,NULL,'Guard',576,593), -(290,289,NULL,NULL,'Guard',577,592), -(291,290,NULL,NULL,'login',578,579), -(292,290,NULL,NULL,'logout',580,581), -(293,290,NULL,NULL,'add',582,583), -(294,290,NULL,NULL,'edit',584,585), -(295,290,NULL,NULL,'index',586,587), -(296,290,NULL,NULL,'view',588,589), -(297,290,NULL,NULL,'delete',590,591), -(298,NULL,NULL,NULL,'functions',595,658), -(299,298,NULL,NULL,'user',596,623), -(300,299,NULL,NULL,'superadmin',597,598), -(301,299,NULL,NULL,'admin',599,600), -(302,299,NULL,NULL,'instructor',601,602), -(303,299,NULL,NULL,'tutor',603,604), -(304,299,NULL,NULL,'student',605,606), -(305,299,NULL,NULL,'import',607,608), -(306,299,NULL,NULL,'password_reset',609,620), -(307,306,NULL,NULL,'superadmin',610,611), -(308,306,NULL,NULL,'admin',612,613), -(309,306,NULL,NULL,'instructor',614,615), -(310,306,NULL,NULL,'tutor',616,617), -(311,306,NULL,NULL,'student',618,619), -(312,299,NULL,NULL,'index',621,622), -(313,298,NULL,NULL,'role',624,635), -(314,313,NULL,NULL,'superadmin',625,626), -(315,313,NULL,NULL,'admin',627,628), -(316,313,NULL,NULL,'instructor',629,630), -(317,313,NULL,NULL,'tutor',631,632), -(318,313,NULL,NULL,'student',633,634), -(319,298,NULL,NULL,'evaluation',636,637), -(320,298,NULL,NULL,'email',638,645), -(321,320,NULL,NULL,'allUsers',639,640), -(322,320,NULL,NULL,'allGroups',641,642), -(323,320,NULL,NULL,'allCourses',643,644), -(324,298,NULL,NULL,'emailtemplate',646,647), -(325,298,NULL,NULL,'viewstudentresults',648,649), -(326,298,NULL,NULL,'viewemailaddresses',650,651), -(327,298,NULL,NULL,'superadmin',652,653), -(328,298,NULL,NULL,'coursemanager',654,655), -(329,298,NULL,NULL,'viewusername',656,657); +(1, NULL, NULL, NULL, 'adminpage', 1, 2), +(2, NULL, NULL, NULL, 'controllers', 3, 596), +(3, 2, NULL, NULL, 'Pages', 4, 17), +(4, 3, NULL, NULL, 'display', 5, 6), +(5, 3, NULL, NULL, 'add', 7, 8), +(6, 3, NULL, NULL, 'edit', 9, 10), +(7, 3, NULL, NULL, 'index', 11, 12), +(8, 3, NULL, NULL, 'view', 13, 14), +(9, 3, NULL, NULL, 'delete', 15, 16), +(10, 2, NULL, NULL, 'Accesses', 18, 29), +(11, 10, NULL, NULL, 'view', 19, 20), +(12, 10, NULL, NULL, 'edit', 21, 22), +(13, 10, NULL, NULL, 'add', 23, 24), +(14, 10, NULL, NULL, 'index', 25, 26), +(15, 10, NULL, NULL, 'delete', 27, 28), +(16, 2, NULL, NULL, 'Courses', 30, 53), +(17, 16, NULL, NULL, 'daysLate', 31, 32), +(18, 16, NULL, NULL, 'index', 33, 34), +(19, 16, NULL, NULL, 'ajaxList', 35, 36), +(20, 16, NULL, NULL, 'view', 37, 38), +(21, 16, NULL, NULL, 'home', 39, 40), +(22, 16, NULL, NULL, 'add', 41, 42), +(23, 16, NULL, NULL, 'edit', 43, 44), +(24, 16, NULL, NULL, 'delete', 45, 46), +(25, 16, NULL, NULL, 'move', 47, 48), +(26, 16, NULL, NULL, 'ajax_options', 49, 50), +(27, 16, NULL, NULL, 'import', 51, 52), +(28, 2, NULL, NULL, 'Departments', 54, 65), +(29, 28, NULL, NULL, 'index', 55, 56), +(30, 28, NULL, NULL, 'view', 57, 58), +(31, 28, NULL, NULL, 'add', 59, 60), +(32, 28, NULL, NULL, 'edit', 61, 62), +(33, 28, NULL, NULL, 'delete', 63, 64), +(34, 2, NULL, NULL, 'Emailer', 66, 93), +(35, 34, NULL, NULL, 'setUpAjaxList', 67, 68), +(36, 34, NULL, NULL, 'ajaxList', 69, 70), +(37, 34, NULL, NULL, 'index', 71, 72), +(38, 34, NULL, NULL, 'write', 73, 74), +(39, 34, NULL, NULL, 'cancel', 75, 76), +(40, 34, NULL, NULL, 'view', 77, 78), +(41, 34, NULL, NULL, 'addRecipient', 79, 80), +(42, 34, NULL, NULL, 'deleteRecipient', 81, 82), +(43, 34, NULL, NULL, 'getRecipient', 83, 84), +(44, 34, NULL, NULL, 'searchByUserId', 85, 86), +(45, 34, NULL, NULL, 'add', 87, 88), +(46, 34, NULL, NULL, 'edit', 89, 90), +(47, 34, NULL, NULL, 'delete', 91, 92), +(48, 2, NULL, NULL, 'Emailtemplates', 94, 113), +(49, 48, NULL, NULL, 'setUpAjaxList', 95, 96), +(50, 48, NULL, NULL, 'ajaxList', 97, 98), +(51, 48, NULL, NULL, 'index', 99, 100), +(52, 48, NULL, NULL, 'add', 101, 102), +(53, 48, NULL, NULL, 'edit', 103, 104), +(54, 48, NULL, NULL, 'delete', 105, 106), +(55, 48, NULL, NULL, 'view', 107, 108), +(56, 48, NULL, NULL, 'displayTemplateContent', 109, 110), +(57, 48, NULL, NULL, 'displayTemplateSubject', 111, 112), +(58, 2, NULL, NULL, 'Evaltools', 114, 125), +(59, 58, NULL, NULL, 'index', 115, 116), +(60, 58, NULL, NULL, 'add', 117, 118), +(61, 58, NULL, NULL, 'edit', 119, 120), +(62, 58, NULL, NULL, 'view', 121, 122), +(63, 58, NULL, NULL, 'delete', 123, 124), +(64, 2, NULL, NULL, 'Evaluations', 126, 165), +(65, 64, NULL, NULL, 'setUpAjaxList', 127, 128), +(66, 64, NULL, NULL, 'ajaxList', 129, 130), +(67, 64, NULL, NULL, 'view', 131, 132), +(68, 64, NULL, NULL, 'index', 133, 134), +(69, 64, NULL, NULL, 'export', 135, 136), +(70, 64, NULL, NULL, 'makeEvaluation', 137, 138), +(71, 64, NULL, NULL, 'completeEvaluationRubric', 139, 140), +(72, 64, NULL, NULL, 'viewEvaluationResults', 141, 142), +(73, 64, NULL, NULL, 'studentViewEvaluationResult', 143, 144), +(74, 64, NULL, NULL, 'markEventReviewed', 145, 146), +(75, 64, NULL, NULL, 'markGradeRelease', 147, 148), +(76, 64, NULL, NULL, 'markCommentRelease', 149, 150), +(77, 64, NULL, NULL, 'changeAllCommentRelease', 151, 152), +(78, 64, NULL, NULL, 'changeAllGradeRelease', 153, 154), +(79, 64, NULL, NULL, 'viewGroupSubmissionDetails', 155, 156), +(80, 64, NULL, NULL, 'viewSurveySummary', 157, 158), +(81, 64, NULL, NULL, 'add', 159, 160), +(82, 64, NULL, NULL, 'edit', 161, 162), +(83, 64, NULL, NULL, 'delete', 163, 164), +(84, 2, NULL, NULL, 'Events', 166, 193), +(85, 84, NULL, NULL, 'postProcessData', 167, 168), +(86, 84, NULL, NULL, 'setUpAjaxList', 169, 170), +(87, 84, NULL, NULL, 'index', 171, 172), +(88, 84, NULL, NULL, 'ajaxList', 173, 174), +(89, 84, NULL, NULL, 'view', 175, 176), +(90, 84, NULL, NULL, 'add', 177, 178), +(91, 84, NULL, NULL, 'setSchedule', 179, 180), +(92, 84, NULL, NULL, 'getGroupMembers', 181, 182), +(93, 84, NULL, NULL, 'edit', 183, 184), +(94, 84, NULL, NULL, 'checkIfChanged', 185, 186), +(95, 84, NULL, NULL, 'calculateFrequency', 187, 188), +(96, 84, NULL, NULL, 'delete', 189, 190), +(97, 84, NULL, NULL, 'checkDuplicateName', 191, 192), +(98, 2, NULL, NULL, 'Faculties', 194, 205), +(99, 98, NULL, NULL, 'index', 195, 196), +(100, 98, NULL, NULL, 'view', 197, 198), +(101, 98, NULL, NULL, 'add', 199, 200), +(102, 98, NULL, NULL, 'edit', 201, 202), +(103, 98, NULL, NULL, 'delete', 203, 204), +(104, 2, NULL, NULL, 'Framework', 206, 221), +(105, 104, NULL, NULL, 'calendarDisplay', 207, 208), +(106, 104, NULL, NULL, 'tutIndex', 209, 210), +(107, 104, NULL, NULL, 'add', 211, 212), +(108, 104, NULL, NULL, 'edit', 213, 214), +(109, 104, NULL, NULL, 'index', 215, 216), +(110, 104, NULL, NULL, 'view', 217, 218), +(111, 104, NULL, NULL, 'delete', 219, 220), +(112, 2, NULL, NULL, 'Groups', 222, 241), +(113, 112, NULL, NULL, 'setUpAjaxList', 223, 224), +(114, 112, NULL, NULL, 'index', 225, 226), +(115, 112, NULL, NULL, 'ajaxList', 227, 228), +(116, 112, NULL, NULL, 'view', 229, 230), +(117, 112, NULL, NULL, 'add', 231, 232), +(118, 112, NULL, NULL, 'edit', 233, 234), +(119, 112, NULL, NULL, 'delete', 235, 236), +(120, 112, NULL, NULL, 'import', 237, 238), +(121, 112, NULL, NULL, 'export', 239, 240), +(122, 2, NULL, NULL, 'Home', 242, 253), +(123, 122, NULL, NULL, 'index', 243, 244), +(124, 122, NULL, NULL, 'add', 245, 246), +(125, 122, NULL, NULL, 'edit', 247, 248), +(126, 122, NULL, NULL, 'view', 249, 250), +(127, 122, NULL, NULL, 'delete', 251, 252), +(128, 2, NULL, NULL, 'Install', 254, 275), +(129, 128, NULL, NULL, 'index', 255, 256), +(130, 128, NULL, NULL, 'install2', 257, 258), +(131, 128, NULL, NULL, 'install3', 259, 260), +(132, 128, NULL, NULL, 'install4', 261, 262), +(133, 128, NULL, NULL, 'install5', 263, 264), +(134, 128, NULL, NULL, 'gpl', 265, 266), +(135, 128, NULL, NULL, 'add', 267, 268), +(136, 128, NULL, NULL, 'edit', 269, 270), +(137, 128, NULL, NULL, 'view', 271, 272), +(138, 128, NULL, NULL, 'delete', 273, 274), +(139, 2, NULL, NULL, 'Lti', 276, 287), +(140, 139, NULL, NULL, 'index', 277, 278), +(141, 139, NULL, NULL, 'add', 279, 280), +(142, 139, NULL, NULL, 'edit', 281, 282), +(143, 139, NULL, NULL, 'view', 283, 284), +(144, 139, NULL, NULL, 'delete', 285, 286), +(145, 2, NULL, NULL, 'Mixevals', 288, 305), +(146, 145, NULL, NULL, 'setUpAjaxList', 289, 290), +(147, 145, NULL, NULL, 'index', 291, 292), +(148, 145, NULL, NULL, 'ajaxList', 293, 294), +(149, 145, NULL, NULL, 'view', 295, 296), +(150, 145, NULL, NULL, 'add', 297, 298), +(151, 145, NULL, NULL, 'edit', 299, 300), +(152, 145, NULL, NULL, 'copy', 301, 302), +(153, 145, NULL, NULL, 'delete', 303, 304), +(154, 2, NULL, NULL, 'Oauthclients', 306, 317), +(155, 154, NULL, NULL, 'index', 307, 308), +(156, 154, NULL, NULL, 'add', 309, 310), +(157, 154, NULL, NULL, 'edit', 311, 312), +(158, 154, NULL, NULL, 'delete', 313, 314), +(159, 154, NULL, NULL, 'view', 315, 316), +(160, 2, NULL, NULL, 'Oauthtokens', 318, 329), +(161, 160, NULL, NULL, 'index', 319, 320), +(162, 160, NULL, NULL, 'add', 321, 322), +(163, 160, NULL, NULL, 'edit', 323, 324), +(164, 160, NULL, NULL, 'delete', 325, 326), +(165, 160, NULL, NULL, 'view', 327, 328), +(166, 2, NULL, NULL, 'Penalty', 330, 343), +(167, 166, NULL, NULL, 'save', 331, 332), +(168, 166, NULL, NULL, 'add', 333, 334), +(169, 166, NULL, NULL, 'edit', 335, 336), +(170, 166, NULL, NULL, 'index', 337, 338), +(171, 166, NULL, NULL, 'view', 339, 340), +(172, 166, NULL, NULL, 'delete', 341, 342), +(173, 2, NULL, NULL, 'Rubrics', 344, 363), +(174, 173, NULL, NULL, 'postProcess', 345, 346), +(175, 173, NULL, NULL, 'setUpAjaxList', 347, 348), +(176, 173, NULL, NULL, 'index', 349, 350), +(177, 173, NULL, NULL, 'ajaxList', 351, 352), +(178, 173, NULL, NULL, 'view', 353, 354), +(179, 173, NULL, NULL, 'add', 355, 356), +(180, 173, NULL, NULL, 'edit', 357, 358), +(181, 173, NULL, NULL, 'copy', 359, 360), +(182, 173, NULL, NULL, 'delete', 361, 362), +(183, 2, NULL, NULL, 'Searchs', 364, 391), +(184, 183, NULL, NULL, 'update', 365, 366), +(185, 183, NULL, NULL, 'index', 367, 368), +(186, 183, NULL, NULL, 'searchEvaluation', 369, 370), +(187, 183, NULL, NULL, 'searchResult', 371, 372), +(188, 183, NULL, NULL, 'searchInstructor', 373, 374), +(189, 183, NULL, NULL, 'eventBoxSearch', 375, 376), +(190, 183, NULL, NULL, 'formatSearchEvaluation', 377, 378), +(191, 183, NULL, NULL, 'formatSearchInstructor', 379, 380), +(192, 183, NULL, NULL, 'formatSearchEvaluationResult', 381, 382), +(193, 183, NULL, NULL, 'add', 383, 384), +(194, 183, NULL, NULL, 'edit', 385, 386), +(195, 183, NULL, NULL, 'view', 387, 388), +(196, 183, NULL, NULL, 'delete', 389, 390), +(197, 2, NULL, NULL, 'Simpleevaluations', 392, 411), +(198, 197, NULL, NULL, 'postProcess', 393, 394), +(199, 197, NULL, NULL, 'setUpAjaxList', 395, 396), +(200, 197, NULL, NULL, 'index', 397, 398), +(201, 197, NULL, NULL, 'ajaxList', 399, 400), +(202, 197, NULL, NULL, 'view', 401, 402), +(203, 197, NULL, NULL, 'add', 403, 404), +(204, 197, NULL, NULL, 'edit', 405, 406), +(205, 197, NULL, NULL, 'copy', 407, 408), +(206, 197, NULL, NULL, 'delete', 409, 410), +(207, 2, NULL, NULL, 'Surveygroups', 412, 443), +(208, 207, NULL, NULL, 'postProcess', 413, 414), +(209, 207, NULL, NULL, 'setUpAjaxList', 415, 416), +(210, 207, NULL, NULL, 'index', 417, 418), +(211, 207, NULL, NULL, 'ajaxList', 419, 420), +(212, 207, NULL, NULL, 'makegroups', 421, 422), +(213, 207, NULL, NULL, 'makegroupssearch', 423, 424), +(214, 207, NULL, NULL, 'maketmgroups', 425, 426), +(215, 207, NULL, NULL, 'savegroups', 427, 428), +(216, 207, NULL, NULL, 'release', 429, 430), +(217, 207, NULL, NULL, 'delete', 431, 432), +(218, 207, NULL, NULL, 'edit', 433, 434), +(219, 207, NULL, NULL, 'changegroupset', 435, 436), +(220, 207, NULL, NULL, 'export', 437, 438), +(221, 207, NULL, NULL, 'add', 439, 440), +(222, 207, NULL, NULL, 'view', 441, 442), +(223, 2, NULL, NULL, 'Surveys', 444, 473), +(224, 223, NULL, NULL, 'setUpAjaxList', 445, 446), +(225, 223, NULL, NULL, 'index', 447, 448), +(226, 223, NULL, NULL, 'ajaxList', 449, 450), +(227, 223, NULL, NULL, 'view', 451, 452), +(228, 223, NULL, NULL, 'add', 453, 454), +(229, 223, NULL, NULL, 'edit', 455, 456), +(230, 223, NULL, NULL, 'copy', 457, 458), +(231, 223, NULL, NULL, 'delete', 459, 460), +(232, 223, NULL, NULL, 'questionsSummary', 461, 462), +(233, 223, NULL, NULL, 'moveQuestion', 463, 464), +(234, 223, NULL, NULL, 'removeQuestion', 465, 466), +(235, 223, NULL, NULL, 'addQuestion', 467, 468), +(236, 223, NULL, NULL, 'editQuestion', 469, 470), +(237, 223, NULL, NULL, 'surveyAccess', 471, 472), +(238, 2, NULL, NULL, 'Sysparameters', 474, 489), +(239, 238, NULL, NULL, 'setUpAjaxList', 475, 476), +(240, 238, NULL, NULL, 'index', 477, 478), +(241, 238, NULL, NULL, 'ajaxList', 479, 480), +(242, 238, NULL, NULL, 'view', 481, 482), +(243, 238, NULL, NULL, 'add', 483, 484), +(244, 238, NULL, NULL, 'edit', 485, 486), +(245, 238, NULL, NULL, 'delete', 487, 488), +(246, 2, NULL, NULL, 'Upgrade', 490, 503), +(247, 246, NULL, NULL, 'index', 491, 492), +(248, 246, NULL, NULL, 'step2', 493, 494), +(249, 246, NULL, NULL, 'add', 495, 496), +(250, 246, NULL, NULL, 'edit', 497, 498), +(251, 246, NULL, NULL, 'view', 499, 500), +(252, 246, NULL, NULL, 'delete', 501, 502), +(253, 2, NULL, NULL, 'Users', 504, 541), +(254, 253, NULL, NULL, 'ajaxList', 505, 506), +(255, 253, NULL, NULL, 'index', 507, 508), +(256, 253, NULL, NULL, 'goToClassList', 509, 510), +(257, 253, NULL, NULL, 'determineIfStudentFromThisData', 511, 512), +(258, 253, NULL, NULL, 'view', 513, 514), +(259, 253, NULL, NULL, 'add', 515, 516), +(260, 253, NULL, NULL, 'enrol', 517, 518), +(261, 253, NULL, NULL, 'edit', 519, 520), +(262, 253, NULL, NULL, 'editProfile', 521, 522), +(263, 253, NULL, NULL, 'delete', 523, 524), +(264, 253, NULL, NULL, 'checkDuplicateName', 525, 526), +(265, 253, NULL, NULL, 'resetPassword', 527, 528), +(266, 253, NULL, NULL, 'resetPasswordWithoutEmail', 529, 530), +(267, 253, NULL, NULL, 'import', 531, 532), +(268, 253, NULL, NULL, 'merge', 533, 534), +(269, 253, NULL, NULL, 'ajax_merge', 535, 536), +(270, 253, NULL, NULL, 'update', 537, 538), +(271, 253, NULL, NULL, 'showEvents', 539, 540), +(272, 2, NULL, NULL, 'V1', 542, 577), +(273, 272, NULL, NULL, 'oauth', 543, 544), +(274, 272, NULL, NULL, 'oauth_error', 545, 546), +(275, 272, NULL, NULL, 'users', 547, 548), +(276, 272, NULL, NULL, 'courses', 549, 550), +(277, 272, NULL, NULL, 'groups', 551, 552), +(278, 272, NULL, NULL, 'groupMembers', 553, 554), +(279, 272, NULL, NULL, 'events', 555, 556), +(280, 272, NULL, NULL, 'grades', 557, 558), +(281, 272, NULL, NULL, 'departments', 559, 560), +(282, 272, NULL, NULL, 'courseDepartments', 561, 562), +(283, 272, NULL, NULL, 'userEvents', 563, 564), +(284, 272, NULL, NULL, 'enrolment', 565, 566), +(285, 272, NULL, NULL, 'add', 567, 568), +(286, 272, NULL, NULL, 'edit', 569, 570), +(287, 272, NULL, NULL, 'index', 571, 572), +(288, 272, NULL, NULL, 'view', 573, 574), +(289, 272, NULL, NULL, 'delete', 575, 576), +(290, 2, NULL, NULL, 'Guard', 578, 595), +(291, 290, NULL, NULL, 'Guard', 579, 594), +(292, 291, NULL, NULL, 'login', 580, 581), +(293, 291, NULL, NULL, 'logout', 582, 583), +(294, 291, NULL, NULL, 'add', 584, 585), +(295, 291, NULL, NULL, 'edit', 586, 587), +(296, 291, NULL, NULL, 'index', 588, 589), +(297, 291, NULL, NULL, 'view', 590, 591), +(298, 291, NULL, NULL, 'delete', 592, 593), +(299, NULL, NULL, NULL, 'functions', 597, 662), +(300, 299, NULL, NULL, 'user', 598, 625), +(301, 300, NULL, NULL, 'superadmin', 599, 600), +(302, 300, NULL, NULL, 'admin', 601, 602), +(303, 300, NULL, NULL, 'instructor', 603, 604), +(304, 300, NULL, NULL, 'tutor', 605, 606), +(305, 300, NULL, NULL, 'student', 607, 608), +(306, 300, NULL, NULL, 'import', 609, 610), +(307, 300, NULL, NULL, 'password_reset', 611, 622), +(308, 307, NULL, NULL, 'superadmin', 612, 613), +(309, 307, NULL, NULL, 'admin', 614, 615), +(310, 307, NULL, NULL, 'instructor', 616, 617), +(311, 307, NULL, NULL, 'tutor', 618, 619), +(312, 307, NULL, NULL, 'student', 620, 621), +(313, 300, NULL, NULL, 'index', 623, 624), +(314, 299, NULL, NULL, 'role', 626, 637), +(315, 314, NULL, NULL, 'superadmin', 627, 628), +(316, 314, NULL, NULL, 'admin', 629, 630), +(317, 314, NULL, NULL, 'instructor', 631, 632), +(318, 314, NULL, NULL, 'tutor', 633, 634), +(319, 314, NULL, NULL, 'student', 635, 636), +(320, 299, NULL, NULL, 'evaluation', 638, 639), +(321, 299, NULL, NULL, 'email', 640, 647), +(322, 321, NULL, NULL, 'allUsers', 641, 642), +(323, 321, NULL, NULL, 'allGroups', 643, 644), +(324, 321, NULL, NULL, 'allCourses', 645, 646), +(325, 299, NULL, NULL, 'emailtemplate', 648, 649), +(326, 299, NULL, NULL, 'viewstudentresults', 650, 651), +(327, 299, NULL, NULL, 'viewemailaddresses', 652, 653), +(328, 299, NULL, NULL, 'superadmin', 654, 655), +(329, 299, NULL, NULL, 'coursemanager', 656, 657), +(330, 299, NULL, NULL, 'viewusername', 658, 659), +(331, 299, NULL, NULL, 'submitstudenteval', 660, 661); DROP TABLE IF EXISTS `aros`; CREATE TABLE IF NOT EXISTS `aros` ( @@ -383,129 +385,134 @@ CREATE TABLE IF NOT EXISTS `aros_acos` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO aros_acos (id, aro_id, aco_id, _create, _read, _update, _delete) VALUES -(1,1,2,'1','1','1','1'), -(2,1,298,'1','1','1','1'), -(3,1,1,'1','1','1','1'), -(4,2,2,'-1','-1','-1','-1'), -(5,2,56,'1','1','1','1'), -(6,2,242,'1','1','1','1'), -(7,2,198,'1','1','1','1'), -(8,2,201,'-1','-1','-1','-1'), -(9,2,200,'-1','-1','-1','-1'), -(10,2,203,'-1','-1','-1','-1'), -(11,2,202,'-1','-1','-1','-1'), -(12,2,199,'-1','-1','-1','-1'), -(13,2,275,'1','1','1','1'), -(14,2,221,'1','1','1','1'), -(15,2,117,'1','1','1','1'), -(16,2,91,'1','1','1','1'), -(17,2,156,'1','1','1','1'), -(18,2,130,'1','1','1','1'), -(19,2,212,'1','1','1','1'), -(20,2,146,'1','1','1','1'), -(21,2,170,'1','1','1','1'), -(22,2,254,'1','1','1','1'), -(23,2,68,'1','1','1','1'), -(24,2,24,'1','1','1','1'), -(25,2,292,'1','1','1','1'), -(26,2,298,'-1','-1','-1','-1'), -(27,2,324,'1','1','1','1'), -(28,2,319,'1','1','1','1'), -(29,2,321,'1','1','1','1'), -(30,2,299,'1','1','1','1'), -(31,2,301,'1','1','1','-1'), -(32,2,300,'-1','-1','-1','-1'), -(33,2,326,'1','1','1','1'), -(34,2,329,'1','1','1','1'), -(35,2,328,'1','1','1','1'), -(36,2,327,'-1','-1','-1','-1'), -(37,3,2,'-1','-1','-1','-1'), -(38,3,56,'1','1','1','1'), -(39,3,242,'1','1','1','1'), -(40,3,275,'1','1','1','1'), -(41,3,221,'1','1','1','1'), -(42,3,117,'1','1','1','1'), -(43,3,91,'1','1','1','1'), -(44,3,156,'1','1','1','1'), -(45,3,130,'1','1','1','1'), -(46,3,212,'1','1','1','1'), -(47,3,146,'1','1','1','1'), -(48,3,170,'1','1','1','1'), -(49,3,254,'1','1','1','1'), -(50,3,68,'1','1','1','1'), -(51,3,24,'1','1','1','1'), -(52,3,292,'1','1','1','1'), -(53,3,44,'1','1','1','1'), -(54,3,46,'1','1','1','1'), -(55,3,113,'1','1','1','1'), -(56,3,115,'1','1','1','1'), -(57,3,38,'-1','-1','-1','-1'), -(58,3,41,'1','1','1','1'), -(59,3,298,'-1','-1','-1','-1'), -(60,3,319,'1','1','-1','-1'), -(61,3,299,'1','1','1','1'), -(62,3,301,'-1','-1','-1','-1'), -(63,3,300,'-1','-1','-1','-1'), -(64,3,302,'-1','1','-1','-1'), -(65,3,312,'-1','-1','-1','-1'), -(66,3,326,'-1','-1','-1','-1'), -(67,3,327,'-1','-1','-1','-1'), -(68,3,328,'1','1','1','1'), -(69,4,2,'-1','-1','-1','-1'), -(70,4,56,'1','1','1','1'), -(71,4,242,'-1','-1','-1','-1'), -(72,4,275,'-1','-1','-1','-1'), -(73,4,221,'-1','-1','-1','-1'), -(74,4,117,'-1','-1','-1','-1'), -(75,4,156,'-1','-1','-1','-1'), -(76,4,130,'-1','-1','-1','-1'), -(77,4,212,'-1','-1','-1','-1'), -(78,4,146,'-1','-1','-1','-1'), -(79,4,170,'-1','-1','-1','-1'), -(80,4,254,'-1','-1','-1','-1'), -(81,4,68,'-1','-1','-1','-1'), -(82,4,24,'-1','-1','-1','-1'), -(83,4,292,'1','1','1','1'), -(84,4,97,'1','1','1','1'), -(85,4,100,'1','1','1','1'), -(86,4,98,'1','1','1','1'), -(87,4,33,'1','1','1','1'), -(88,4,298,'-1','-1','-1','-1'), -(89,4,326,'-1','-1','-1','-1'), -(90,4,327,'-1','-1','-1','-1'), -(91,5,2,'-1','-1','-1','-1'), -(92,5,56,'1','1','1','1'), -(93,5,242,'-1','-1','-1','-1'), -(94,5,275,'-1','-1','-1','-1'), -(95,5,221,'-1','-1','-1','-1'), -(96,5,117,'-1','-1','-1','-1'), -(97,5,156,'-1','-1','-1','-1'), -(98,5,130,'-1','-1','-1','-1'), -(99,5,212,'-1','-1','-1','-1'), -(100,5,146,'-1','-1','-1','-1'), -(101,5,170,'-1','-1','-1','-1'), -(102,5,254,'-1','-1','-1','-1'), -(103,5,68,'-1','-1','-1','-1'), -(104,5,24,'-1','-1','-1','-1'), -(105,5,292,'1','1','1','1'), -(106,5,97,'1','1','1','1'), -(107,5,100,'1','1','1','1'), -(108,5,98,'1','1','1','1'), -(109,5,33,'1','1','1','1'), -(110,5,44,'1','1','1','1'), -(111,5,46,'1','1','1','1'), -(112,5,113,'1','1','1','1'), -(113,5,115,'1','1','1','1'), -(114,5,298,'-1','-1','-1','-1'), -(115,5,325,'1','1','1','1'), -(116,5,326,'-1','-1','-1','-1'), -(117,5,327,'-1','-1','-1','-1'); +(1, 1, 2, '1', '1', '1', '1'), +(2, 1, 299, '1', '1', '1', '1'), +(3, 1, 1, '1', '1', '1', '1'), +(4, 2, 2, '-1', '-1', '-1', '-1'), +(5, 2, 122, '1', '1', '1', '1'), +(6, 2, 16, '1', '1', '1', '1'), +(7, 2, 28, '1', '1', '1', '1'), +(8, 2, 31, '-1', '-1', '-1', '-1'), +(9, 2, 30, '-1', '-1', '-1', '-1'), +(10, 2, 33, '-1', '-1', '-1', '-1'), +(11, 2, 32, '-1', '-1', '-1', '-1'), +(12, 2, 29, '-1', '-1', '-1', '-1'), +(13, 2, 34, '1', '1', '1', '1'), +(14, 2, 48, '1', '1', '1', '1'), +(15, 2, 58, '1', '1', '1', '1'), +(16, 2, 64, '1', '1', '1', '1'), +(17, 2, 84, '1', '1', '1', '1'), +(18, 2, 112, '1', '1', '1', '1'), +(19, 2, 145, '1', '1', '1', '1'), +(20, 2, 173, '1', '1', '1', '1'), +(21, 2, 197, '1', '1', '1', '1'), +(22, 2, 223, '1', '1', '1', '1'), +(23, 2, 207, '1', '1', '1', '1'), +(24, 2, 253, '1', '1', '1', '1'), +(25, 2, 266, '-1', '-1', '-1', '-1'), +(26, 2, 293, '1', '1', '1', '1'), +(27, 2, 299, '-1', '-1', '-1', '-1'), +(28, 2, 325, '1', '1', '1', '1'), +(29, 2, 320, '1', '1', '1', '1'), +(30, 2, 322, '1', '1', '1', '1'), +(31, 2, 300, '1', '1', '1', '1'), +(32, 2, 302, '1', '1', '1', '-1'), +(33, 2, 301, '-1', '-1', '-1', '-1'), +(34, 2, 327, '1', '1', '1', '1'), +(35, 2, 330, '1', '1', '1', '1'), +(36, 2, 329, '1', '1', '1', '1'), +(37, 2, 328, '-1', '-1', '-1', '-1'), +(38, 2, 331, '1', '1', '1', '1'), +(39, 3, 2, '-1', '-1', '-1', '-1'), +(40, 3, 122, '1', '1', '1', '1'), +(41, 3, 16, '1', '1', '1', '1'), +(42, 3, 34, '1', '1', '1', '1'), +(43, 3, 48, '1', '1', '1', '1'), +(44, 3, 58, '1', '1', '1', '1'), +(45, 3, 64, '1', '1', '1', '1'), +(46, 3, 84, '1', '1', '1', '1'), +(47, 3, 112, '1', '1', '1', '1'), +(48, 3, 145, '1', '1', '1', '1'), +(49, 3, 173, '1', '1', '1', '1'), +(50, 3, 197, '1', '1', '1', '1'), +(51, 3, 223, '1', '1', '1', '1'), +(52, 3, 207, '1', '1', '1', '1'), +(53, 3, 253, '1', '1', '1', '1'), +(54, 3, 293, '1', '1', '1', '1'), +(55, 3, 156, '1', '1', '1', '1'), +(56, 3, 158, '1', '1', '1', '1'), +(57, 3, 162, '1', '1', '1', '1'), +(58, 3, 164, '1', '1', '1', '1'), +(59, 3, 268, '-1', '-1', '-1', '-1'), +(60, 3, 271, '1', '1', '1', '1'), +(61, 3, 266, '-1', '-1', '-1', '-1'), +(62, 3, 299, '-1', '-1', '-1', '-1'), +(63, 3, 320, '1', '1', '-1', '-1'), +(64, 3, 300, '1', '1', '1', '1'), +(65, 3, 302, '-1', '-1', '-1', '-1'), +(66, 3, 301, '-1', '-1', '-1', '-1'), +(67, 3, 303, '-1', '1', '-1', '-1'), +(68, 3, 313, '-1', '-1', '-1', '-1'), +(69, 3, 327, '-1', '-1', '-1', '-1'), +(70, 3, 328, '-1', '-1', '-1', '-1'), +(71, 3, 329, '1', '1', '1', '1'), +(72, 3, 331, '-1', '-1', '-1', '-1'), +(73, 4, 2, '-1', '-1', '-1', '-1'), +(74, 4, 122, '1', '1', '1', '1'), +(75, 4, 16, '-1', '-1', '-1', '-1'), +(76, 4, 34, '-1', '-1', '-1', '-1'), +(77, 4, 48, '-1', '-1', '-1', '-1'), +(78, 4, 58, '-1', '-1', '-1', '-1'), +(79, 4, 84, '-1', '-1', '-1', '-1'), +(80, 4, 112, '-1', '-1', '-1', '-1'), +(81, 4, 145, '-1', '-1', '-1', '-1'), +(82, 4, 173, '-1', '-1', '-1', '-1'), +(83, 4, 197, '-1', '-1', '-1', '-1'), +(84, 4, 223, '-1', '-1', '-1', '-1'), +(85, 4, 207, '-1', '-1', '-1', '-1'), +(86, 4, 253, '-1', '-1', '-1', '-1'), +(87, 4, 293, '1', '1', '1', '1'), +(88, 4, 70, '1', '1', '1', '1'), +(89, 4, 73, '1', '1', '1', '1'), +(90, 4, 71, '1', '1', '1', '1'), +(91, 4, 262, '1', '1', '1', '1'), +(92, 4, 299, '-1', '-1', '-1', '-1'), +(93, 4, 327, '-1', '-1', '-1', '-1'), +(94, 4, 328, '-1', '-1', '-1', '-1'), +(95, 5, 2, '-1', '-1', '-1', '-1'), +(96, 5, 122, '1', '1', '1', '1'), +(97, 5, 16, '-1', '-1', '-1', '-1'), +(98, 5, 34, '-1', '-1', '-1', '-1'), +(99, 5, 48, '-1', '-1', '-1', '-1'), +(100, 5, 58, '-1', '-1', '-1', '-1'), +(101, 5, 84, '-1', '-1', '-1', '-1'), +(102, 5, 112, '-1', '-1', '-1', '-1'), +(103, 5, 145, '-1', '-1', '-1', '-1'), +(104, 5, 173, '-1', '-1', '-1', '-1'), +(105, 5, 197, '-1', '-1', '-1', '-1'), +(106, 5, 223, '-1', '-1', '-1', '-1'), +(107, 5, 207, '-1', '-1', '-1', '-1'), +(108, 5, 253, '-1', '-1', '-1', '-1'), +(109, 5, 293, '1', '1', '1', '1'), +(110, 5, 70, '1', '1', '1', '1'), +(111, 5, 73, '1', '1', '1', '1'), +(112, 5, 71, '1', '1', '1', '1'), +(113, 5, 262, '1', '1', '1', '1'), +(114, 5, 156, '1', '1', '1', '1'), +(115, 5, 158, '1', '1', '1', '1'), +(116, 5, 162, '1', '1', '1', '1'), +(117, 5, 164, '1', '1', '1', '1'), +(118, 5, 299, '-1', '-1', '-1', '-1'), +(119, 5, 326, '1', '1', '1', '1'), +(120, 5, 327, '-1', '-1', '-1', '-1'), +(121, 5, 328, '-1', '-1', '-1', '-1'); --- This file contains queries that add a single column to two tables. +-- This file contains queries that add a single column to three tables. -- This column is used to hide/show the evaluation marks to the user. ALTER TABLE mixeval_questions ADD show_marks INT(1) AFTER scale_level; ALTER TABLE rubrics_criterias ADD show_marks INT(1) AFTER multiplier; +ALTER TABLE rubrics ADD view_mode VARCHAR(10) AFTER criteria; -- Update database version, done as the very last operation as a sign that -- the update went well. diff --git a/app/config/sql/delta_8.sql b/app/config/sql/delta_8.sql deleted file mode 100644 index 2ce1ef935..000000000 --- a/app/config/sql/delta_8.sql +++ /dev/null @@ -1,9 +0,0 @@ --- This file contains queries that add a single column to two tables. --- This column is used to hide/show the evaluation marks to the user. - -ALTER TABLE rubrics ADD view_mode VARCHAR(10) AFTER criteria; - --- Update database version, done as the very last operation as a sign that --- the update went well. -UPDATE `sys_parameters` SET `parameter_value` = '8' WHERE `parameter_code` = 'database.version'; - diff --git a/app/config/sql/ipeer.sql b/app/config/sql/ipeer.sql index bba320140..665edca1b 100644 --- a/app/config/sql/ipeer.sql +++ b/app/config/sql/ipeer.sql @@ -36,335 +36,337 @@ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101 SET NAMES utf8 */; INSERT INTO acos (id, parent_id, model, foreign_key, alias, lft, rght) VALUES -(1,NULL,NULL,NULL,'adminpage',1,2), -(2,NULL,NULL,NULL,'controllers',3,594), -(3,2,NULL,NULL,'Pages',4,17), -(4,3,NULL,NULL,'display',5,6), -(5,3,NULL,NULL,'add',7,8), -(6,3,NULL,NULL,'edit',9,10), -(7,3,NULL,NULL,'index',11,12), -(8,3,NULL,NULL,'view',13,14), -(9,3,NULL,NULL,'delete',15,16), -(10,2,NULL,NULL,'Searchs',18,45), -(11,10,NULL,NULL,'update',19,20), -(12,10,NULL,NULL,'index',21,22), -(13,10,NULL,NULL,'searchEvaluation',23,24), -(14,10,NULL,NULL,'searchResult',25,26), -(15,10,NULL,NULL,'searchInstructor',27,28), -(16,10,NULL,NULL,'eventBoxSearch',29,30), -(17,10,NULL,NULL,'formatSearchEvaluation',31,32), -(18,10,NULL,NULL,'formatSearchInstructor',33,34), -(19,10,NULL,NULL,'formatSearchEvaluationResult',35,36), -(20,10,NULL,NULL,'add',37,38), -(21,10,NULL,NULL,'edit',39,40), -(22,10,NULL,NULL,'view',41,42), -(23,10,NULL,NULL,'delete',43,44), -(24,2,NULL,NULL,'Users',46,81), -(25,24,NULL,NULL,'ajaxList',47,48), -(26,24,NULL,NULL,'index',49,50), -(27,24,NULL,NULL,'goToClassList',51,52), -(28,24,NULL,NULL,'determineIfStudentFromThisData',53,54), -(29,24,NULL,NULL,'view',55,56), -(30,24,NULL,NULL,'add',57,58), -(31,24,NULL,NULL,'enrol',59,60), -(32,24,NULL,NULL,'edit',61,62), -(33,24,NULL,NULL,'editProfile',63,64), -(34,24,NULL,NULL,'delete',65,66), -(35,24,NULL,NULL,'checkDuplicateName',67,68), -(36,24,NULL,NULL,'resetPassword',69,70), -(37,24,NULL,NULL,'import',71,72), -(38,24,NULL,NULL,'merge',73,74), -(39,24,NULL,NULL,'ajax_merge',75,76), -(40,24,NULL,NULL,'update',77,78), -(41,24,NULL,NULL,'showEvents',79,80), -(42,2,NULL,NULL,'Oauthclients',82,93), -(43,42,NULL,NULL,'index',83,84), -(44,42,NULL,NULL,'add',85,86), -(45,42,NULL,NULL,'edit',87,88), -(46,42,NULL,NULL,'delete',89,90), -(47,42,NULL,NULL,'view',91,92), -(48,2,NULL,NULL,'Framework',94,109), -(49,48,NULL,NULL,'calendarDisplay',95,96), -(50,48,NULL,NULL,'tutIndex',97,98), -(51,48,NULL,NULL,'add',99,100), -(52,48,NULL,NULL,'edit',101,102), -(53,48,NULL,NULL,'index',103,104), -(54,48,NULL,NULL,'view',105,106), -(55,48,NULL,NULL,'delete',107,108), -(56,2,NULL,NULL,'Home',110,121), -(57,56,NULL,NULL,'index',111,112), -(58,56,NULL,NULL,'add',113,114), -(59,56,NULL,NULL,'edit',115,116), -(60,56,NULL,NULL,'view',117,118), -(61,56,NULL,NULL,'delete',119,120), -(62,2,NULL,NULL,'Accesses',122,133), -(63,62,NULL,NULL,'view',123,124), -(64,62,NULL,NULL,'edit',125,126), -(65,62,NULL,NULL,'add',127,128), -(66,62,NULL,NULL,'index',129,130), -(67,62,NULL,NULL,'delete',131,132), -(68,2,NULL,NULL,'Surveygroups',134,165), -(69,68,NULL,NULL,'postProcess',135,136), -(70,68,NULL,NULL,'setUpAjaxList',137,138), -(71,68,NULL,NULL,'index',139,140), -(72,68,NULL,NULL,'ajaxList',141,142), -(73,68,NULL,NULL,'makegroups',143,144), -(74,68,NULL,NULL,'makegroupssearch',145,146), -(75,68,NULL,NULL,'maketmgroups',147,148), -(76,68,NULL,NULL,'savegroups',149,150), -(77,68,NULL,NULL,'release',151,152), -(78,68,NULL,NULL,'delete',153,154), -(79,68,NULL,NULL,'edit',155,156), -(80,68,NULL,NULL,'changegroupset',157,158), -(81,68,NULL,NULL,'export',159,160), -(82,68,NULL,NULL,'add',161,162), -(83,68,NULL,NULL,'view',163,164), -(84,2,NULL,NULL,'Upgrade',166,179), -(85,84,NULL,NULL,'index',167,168), -(86,84,NULL,NULL,'step2',169,170), -(87,84,NULL,NULL,'add',171,172), -(88,84,NULL,NULL,'edit',173,174), -(89,84,NULL,NULL,'view',175,176), -(90,84,NULL,NULL,'delete',177,178), -(91,2,NULL,NULL,'Evaluations',180,219), -(92,91,NULL,NULL,'setUpAjaxList',181,182), -(93,91,NULL,NULL,'ajaxList',183,184), -(94,91,NULL,NULL,'view',185,186), -(95,91,NULL,NULL,'index',187,188), -(96,91,NULL,NULL,'export',189,190), -(97,91,NULL,NULL,'makeEvaluation',191,192), -(98,91,NULL,NULL,'completeEvaluationRubric',193,194), -(99,91,NULL,NULL,'viewEvaluationResults',195,196), -(100,91,NULL,NULL,'studentViewEvaluationResult',197,198), -(101,91,NULL,NULL,'markEventReviewed',199,200), -(102,91,NULL,NULL,'markGradeRelease',201,202), -(103,91,NULL,NULL,'markCommentRelease',203,204), -(104,91,NULL,NULL,'changeAllCommentRelease',205,206), -(105,91,NULL,NULL,'changeAllGradeRelease',207,208), -(106,91,NULL,NULL,'viewGroupSubmissionDetails',209,210), -(107,91,NULL,NULL,'viewSurveySummary',211,212), -(108,91,NULL,NULL,'add',213,214), -(109,91,NULL,NULL,'edit',215,216), -(110,91,NULL,NULL,'delete',217,218), -(111,2,NULL,NULL,'Oauthtokens',220,231), -(112,111,NULL,NULL,'index',221,222), -(113,111,NULL,NULL,'add',223,224), -(114,111,NULL,NULL,'edit',225,226), -(115,111,NULL,NULL,'delete',227,228), -(116,111,NULL,NULL,'view',229,230), -(117,2,NULL,NULL,'Evaltools',232,243), -(118,117,NULL,NULL,'index',233,234), -(119,117,NULL,NULL,'add',235,236), -(120,117,NULL,NULL,'edit',237,238), -(121,117,NULL,NULL,'view',239,240), -(122,117,NULL,NULL,'delete',241,242), -(123,2,NULL,NULL,'Penalty',244,257), -(124,123,NULL,NULL,'save',245,246), -(125,123,NULL,NULL,'add',247,248), -(126,123,NULL,NULL,'edit',249,250), -(127,123,NULL,NULL,'index',251,252), -(128,123,NULL,NULL,'view',253,254), -(129,123,NULL,NULL,'delete',255,256), -(130,2,NULL,NULL,'Groups',258,277), -(131,130,NULL,NULL,'setUpAjaxList',259,260), -(132,130,NULL,NULL,'index',261,262), -(133,130,NULL,NULL,'ajaxList',263,264), -(134,130,NULL,NULL,'view',265,266), -(135,130,NULL,NULL,'add',267,268), -(136,130,NULL,NULL,'edit',269,270), -(137,130,NULL,NULL,'delete',271,272), -(138,130,NULL,NULL,'import',273,274), -(139,130,NULL,NULL,'export',275,276), -(140,2,NULL,NULL,'Faculties',278,289), -(141,140,NULL,NULL,'index',279,280), -(142,140,NULL,NULL,'view',281,282), -(143,140,NULL,NULL,'add',283,284), -(144,140,NULL,NULL,'edit',285,286), -(145,140,NULL,NULL,'delete',287,288), -(146,2,NULL,NULL,'Rubrics',290,309), -(147,146,NULL,NULL,'postProcess',291,292), -(148,146,NULL,NULL,'setUpAjaxList',293,294), -(149,146,NULL,NULL,'index',295,296), -(150,146,NULL,NULL,'ajaxList',297,298), -(151,146,NULL,NULL,'view',299,300), -(152,146,NULL,NULL,'add',301,302), -(153,146,NULL,NULL,'edit',303,304), -(154,146,NULL,NULL,'copy',305,306), -(155,146,NULL,NULL,'delete',307,308), -(156,2,NULL,NULL,'Events',310,337), -(157,156,NULL,NULL,'postProcessData',311,312), -(158,156,NULL,NULL,'setUpAjaxList',313,314), -(159,156,NULL,NULL,'index',315,316), -(160,156,NULL,NULL,'ajaxList',317,318), -(161,156,NULL,NULL,'view',319,320), -(162,156,NULL,NULL,'add',321,322), -(163,156,NULL,NULL,'setSchedule',323,324), -(164,156,NULL,NULL,'getGroupMembers',325,326), -(165,156,NULL,NULL,'edit',327,328), -(166,156,NULL,NULL,'checkIfChanged',329,330), -(167,156,NULL,NULL,'calculateFrequency',331,332), -(168,156,NULL,NULL,'delete',333,334), -(169,156,NULL,NULL,'checkDuplicateName',335,336), -(170,2,NULL,NULL,'Simpleevaluations',338,357), -(171,170,NULL,NULL,'postProcess',339,340), -(172,170,NULL,NULL,'setUpAjaxList',341,342), -(173,170,NULL,NULL,'index',343,344), -(174,170,NULL,NULL,'ajaxList',345,346), -(175,170,NULL,NULL,'view',347,348), -(176,170,NULL,NULL,'add',349,350), -(177,170,NULL,NULL,'edit',351,352), -(178,170,NULL,NULL,'copy',353,354), -(179,170,NULL,NULL,'delete',355,356), -(180,2,NULL,NULL,'V1',358,393), -(181,180,NULL,NULL,'oauth',359,360), -(182,180,NULL,NULL,'oauth_error',361,362), -(183,180,NULL,NULL,'users',363,364), -(184,180,NULL,NULL,'courses',365,366), -(185,180,NULL,NULL,'groups',367,368), -(186,180,NULL,NULL,'groupMembers',369,370), -(187,180,NULL,NULL,'events',371,372), -(188,180,NULL,NULL,'grades',373,374), -(189,180,NULL,NULL,'departments',375,376), -(190,180,NULL,NULL,'courseDepartments',377,378), -(191,180,NULL,NULL,'userEvents',379,380), -(192,180,NULL,NULL,'enrolment',381,382), -(193,180,NULL,NULL,'add',383,384), -(194,180,NULL,NULL,'edit',385,386), -(195,180,NULL,NULL,'index',387,388), -(196,180,NULL,NULL,'view',389,390), -(197,180,NULL,NULL,'delete',391,392), -(198,2,NULL,NULL,'Departments',394,405), -(199,198,NULL,NULL,'index',395,396), -(200,198,NULL,NULL,'view',397,398), -(201,198,NULL,NULL,'add',399,400), -(202,198,NULL,NULL,'edit',401,402), -(203,198,NULL,NULL,'delete',403,404), -(204,2,NULL,NULL,'Sysparameters',406,421), -(205,204,NULL,NULL,'setUpAjaxList',407,408), -(206,204,NULL,NULL,'index',409,410), -(207,204,NULL,NULL,'ajaxList',411,412), -(208,204,NULL,NULL,'view',413,414), -(209,204,NULL,NULL,'add',415,416), -(210,204,NULL,NULL,'edit',417,418), -(211,204,NULL,NULL,'delete',419,420), -(212,2,NULL,NULL,'Mixevals',422,439), -(213,212,NULL,NULL,'setUpAjaxList',423,424), -(214,212,NULL,NULL,'index',425,426), -(215,212,NULL,NULL,'ajaxList',427,428), -(216,212,NULL,NULL,'view',429,430), -(217,212,NULL,NULL,'add',431,432), -(218,212,NULL,NULL,'edit',433,434), -(219,212,NULL,NULL,'copy',435,436), -(220,212,NULL,NULL,'delete',437,438), -(221,2,NULL,NULL,'Emailtemplates',440,459), -(222,221,NULL,NULL,'setUpAjaxList',441,442), -(223,221,NULL,NULL,'ajaxList',443,444), -(224,221,NULL,NULL,'index',445,446), -(225,221,NULL,NULL,'add',447,448), -(226,221,NULL,NULL,'edit',449,450), -(227,221,NULL,NULL,'delete',451,452), -(228,221,NULL,NULL,'view',453,454), -(229,221,NULL,NULL,'displayTemplateContent',455,456), -(230,221,NULL,NULL,'displayTemplateSubject',457,458), -(231,2,NULL,NULL,'Install',460,481), -(232,231,NULL,NULL,'index',461,462), -(233,231,NULL,NULL,'install2',463,464), -(234,231,NULL,NULL,'install3',465,466), -(235,231,NULL,NULL,'install4',467,468), -(236,231,NULL,NULL,'install5',469,470), -(237,231,NULL,NULL,'gpl',471,472), -(238,231,NULL,NULL,'add',473,474), -(239,231,NULL,NULL,'edit',475,476), -(240,231,NULL,NULL,'view',477,478), -(241,231,NULL,NULL,'delete',479,480), -(242,2,NULL,NULL,'Courses',482,505), -(243,242,NULL,NULL,'daysLate',483,484), -(244,242,NULL,NULL,'index',485,486), -(245,242,NULL,NULL,'ajaxList',487,488), -(246,242,NULL,NULL,'view',489,490), -(247,242,NULL,NULL,'home',491,492), -(248,242,NULL,NULL,'add',493,494), -(249,242,NULL,NULL,'edit',495,496), -(250,242,NULL,NULL,'delete',497,498), -(251,242,NULL,NULL,'move',499,500), -(252,242,NULL,NULL,'ajax_options',501,502), -(253,242,NULL,NULL,'import',503,504), -(254,2,NULL,NULL,'Surveys',506,535), -(255,254,NULL,NULL,'setUpAjaxList',507,508), -(256,254,NULL,NULL,'index',509,510), -(257,254,NULL,NULL,'ajaxList',511,512), -(258,254,NULL,NULL,'view',513,514), -(259,254,NULL,NULL,'add',515,516), -(260,254,NULL,NULL,'edit',517,518), -(261,254,NULL,NULL,'copy',519,520), -(262,254,NULL,NULL,'delete',521,522), -(263,254,NULL,NULL,'questionsSummary',523,524), -(264,254,NULL,NULL,'moveQuestion',525,526), -(265,254,NULL,NULL,'removeQuestion',527,528), -(266,254,NULL,NULL,'addQuestion',529,530), -(267,254,NULL,NULL,'editQuestion',531,532), -(268,254,NULL,NULL,'surveyAccess',533,534), -(269,2,NULL,NULL,'Lti',536,547), -(270,269,NULL,NULL,'index',537,538), -(271,269,NULL,NULL,'add',539,540), -(272,269,NULL,NULL,'edit',541,542), -(273,269,NULL,NULL,'view',543,544), -(274,269,NULL,NULL,'delete',545,546), -(275,2,NULL,NULL,'Emailer',548,575), -(276,275,NULL,NULL,'setUpAjaxList',549,550), -(277,275,NULL,NULL,'ajaxList',551,552), -(278,275,NULL,NULL,'index',553,554), -(279,275,NULL,NULL,'write',555,556), -(280,275,NULL,NULL,'cancel',557,558), -(281,275,NULL,NULL,'view',559,560), -(282,275,NULL,NULL,'addRecipient',561,562), -(283,275,NULL,NULL,'deleteRecipient',563,564), -(284,275,NULL,NULL,'getRecipient',565,566), -(285,275,NULL,NULL,'searchByUserId',567,568), -(286,275,NULL,NULL,'add',569,570), -(287,275,NULL,NULL,'edit',571,572), -(288,275,NULL,NULL,'delete',573,574), -(289,2,NULL,NULL,'Guard',576,593), -(290,289,NULL,NULL,'Guard',577,592), -(291,290,NULL,NULL,'login',578,579), -(292,290,NULL,NULL,'logout',580,581), -(293,290,NULL,NULL,'add',582,583), -(294,290,NULL,NULL,'edit',584,585), -(295,290,NULL,NULL,'index',586,587), -(296,290,NULL,NULL,'view',588,589), -(297,290,NULL,NULL,'delete',590,591), -(298,NULL,NULL,NULL,'functions',595,658), -(299,298,NULL,NULL,'user',596,623), -(300,299,NULL,NULL,'superadmin',597,598), -(301,299,NULL,NULL,'admin',599,600), -(302,299,NULL,NULL,'instructor',601,602), -(303,299,NULL,NULL,'tutor',603,604), -(304,299,NULL,NULL,'student',605,606), -(305,299,NULL,NULL,'import',607,608), -(306,299,NULL,NULL,'password_reset',609,620), -(307,306,NULL,NULL,'superadmin',610,611), -(308,306,NULL,NULL,'admin',612,613), -(309,306,NULL,NULL,'instructor',614,615), -(310,306,NULL,NULL,'tutor',616,617), -(311,306,NULL,NULL,'student',618,619), -(312,299,NULL,NULL,'index',621,622), -(313,298,NULL,NULL,'role',624,635), -(314,313,NULL,NULL,'superadmin',625,626), -(315,313,NULL,NULL,'admin',627,628), -(316,313,NULL,NULL,'instructor',629,630), -(317,313,NULL,NULL,'tutor',631,632), -(318,313,NULL,NULL,'student',633,634), -(319,298,NULL,NULL,'evaluation',636,637), -(320,298,NULL,NULL,'email',638,645), -(321,320,NULL,NULL,'allUsers',639,640), -(322,320,NULL,NULL,'allGroups',641,642), -(323,320,NULL,NULL,'allCourses',643,644), -(324,298,NULL,NULL,'emailtemplate',646,647), -(325,298,NULL,NULL,'viewstudentresults',648,649), -(326,298,NULL,NULL,'viewemailaddresses',650,651), -(327,298,NULL,NULL,'superadmin',652,653), -(328,298,NULL,NULL,'coursemanager',654,655), -(329,298,NULL,NULL,'viewusername',656,657); +(1, NULL, NULL, NULL, 'adminpage', 1, 2), +(2, NULL, NULL, NULL, 'controllers', 3, 596), +(3, 2, NULL, NULL, 'Pages', 4, 17), +(4, 3, NULL, NULL, 'display', 5, 6), +(5, 3, NULL, NULL, 'add', 7, 8), +(6, 3, NULL, NULL, 'edit', 9, 10), +(7, 3, NULL, NULL, 'index', 11, 12), +(8, 3, NULL, NULL, 'view', 13, 14), +(9, 3, NULL, NULL, 'delete', 15, 16), +(10, 2, NULL, NULL, 'Accesses', 18, 29), +(11, 10, NULL, NULL, 'view', 19, 20), +(12, 10, NULL, NULL, 'edit', 21, 22), +(13, 10, NULL, NULL, 'add', 23, 24), +(14, 10, NULL, NULL, 'index', 25, 26), +(15, 10, NULL, NULL, 'delete', 27, 28), +(16, 2, NULL, NULL, 'Courses', 30, 53), +(17, 16, NULL, NULL, 'daysLate', 31, 32), +(18, 16, NULL, NULL, 'index', 33, 34), +(19, 16, NULL, NULL, 'ajaxList', 35, 36), +(20, 16, NULL, NULL, 'view', 37, 38), +(21, 16, NULL, NULL, 'home', 39, 40), +(22, 16, NULL, NULL, 'add', 41, 42), +(23, 16, NULL, NULL, 'edit', 43, 44), +(24, 16, NULL, NULL, 'delete', 45, 46), +(25, 16, NULL, NULL, 'move', 47, 48), +(26, 16, NULL, NULL, 'ajax_options', 49, 50), +(27, 16, NULL, NULL, 'import', 51, 52), +(28, 2, NULL, NULL, 'Departments', 54, 65), +(29, 28, NULL, NULL, 'index', 55, 56), +(30, 28, NULL, NULL, 'view', 57, 58), +(31, 28, NULL, NULL, 'add', 59, 60), +(32, 28, NULL, NULL, 'edit', 61, 62), +(33, 28, NULL, NULL, 'delete', 63, 64), +(34, 2, NULL, NULL, 'Emailer', 66, 93), +(35, 34, NULL, NULL, 'setUpAjaxList', 67, 68), +(36, 34, NULL, NULL, 'ajaxList', 69, 70), +(37, 34, NULL, NULL, 'index', 71, 72), +(38, 34, NULL, NULL, 'write', 73, 74), +(39, 34, NULL, NULL, 'cancel', 75, 76), +(40, 34, NULL, NULL, 'view', 77, 78), +(41, 34, NULL, NULL, 'addRecipient', 79, 80), +(42, 34, NULL, NULL, 'deleteRecipient', 81, 82), +(43, 34, NULL, NULL, 'getRecipient', 83, 84), +(44, 34, NULL, NULL, 'searchByUserId', 85, 86), +(45, 34, NULL, NULL, 'add', 87, 88), +(46, 34, NULL, NULL, 'edit', 89, 90), +(47, 34, NULL, NULL, 'delete', 91, 92), +(48, 2, NULL, NULL, 'Emailtemplates', 94, 113), +(49, 48, NULL, NULL, 'setUpAjaxList', 95, 96), +(50, 48, NULL, NULL, 'ajaxList', 97, 98), +(51, 48, NULL, NULL, 'index', 99, 100), +(52, 48, NULL, NULL, 'add', 101, 102), +(53, 48, NULL, NULL, 'edit', 103, 104), +(54, 48, NULL, NULL, 'delete', 105, 106), +(55, 48, NULL, NULL, 'view', 107, 108), +(56, 48, NULL, NULL, 'displayTemplateContent', 109, 110), +(57, 48, NULL, NULL, 'displayTemplateSubject', 111, 112), +(58, 2, NULL, NULL, 'Evaltools', 114, 125), +(59, 58, NULL, NULL, 'index', 115, 116), +(60, 58, NULL, NULL, 'add', 117, 118), +(61, 58, NULL, NULL, 'edit', 119, 120), +(62, 58, NULL, NULL, 'view', 121, 122), +(63, 58, NULL, NULL, 'delete', 123, 124), +(64, 2, NULL, NULL, 'Evaluations', 126, 165), +(65, 64, NULL, NULL, 'setUpAjaxList', 127, 128), +(66, 64, NULL, NULL, 'ajaxList', 129, 130), +(67, 64, NULL, NULL, 'view', 131, 132), +(68, 64, NULL, NULL, 'index', 133, 134), +(69, 64, NULL, NULL, 'export', 135, 136), +(70, 64, NULL, NULL, 'makeEvaluation', 137, 138), +(71, 64, NULL, NULL, 'completeEvaluationRubric', 139, 140), +(72, 64, NULL, NULL, 'viewEvaluationResults', 141, 142), +(73, 64, NULL, NULL, 'studentViewEvaluationResult', 143, 144), +(74, 64, NULL, NULL, 'markEventReviewed', 145, 146), +(75, 64, NULL, NULL, 'markGradeRelease', 147, 148), +(76, 64, NULL, NULL, 'markCommentRelease', 149, 150), +(77, 64, NULL, NULL, 'changeAllCommentRelease', 151, 152), +(78, 64, NULL, NULL, 'changeAllGradeRelease', 153, 154), +(79, 64, NULL, NULL, 'viewGroupSubmissionDetails', 155, 156), +(80, 64, NULL, NULL, 'viewSurveySummary', 157, 158), +(81, 64, NULL, NULL, 'add', 159, 160), +(82, 64, NULL, NULL, 'edit', 161, 162), +(83, 64, NULL, NULL, 'delete', 163, 164), +(84, 2, NULL, NULL, 'Events', 166, 193), +(85, 84, NULL, NULL, 'postProcessData', 167, 168), +(86, 84, NULL, NULL, 'setUpAjaxList', 169, 170), +(87, 84, NULL, NULL, 'index', 171, 172), +(88, 84, NULL, NULL, 'ajaxList', 173, 174), +(89, 84, NULL, NULL, 'view', 175, 176), +(90, 84, NULL, NULL, 'add', 177, 178), +(91, 84, NULL, NULL, 'setSchedule', 179, 180), +(92, 84, NULL, NULL, 'getGroupMembers', 181, 182), +(93, 84, NULL, NULL, 'edit', 183, 184), +(94, 84, NULL, NULL, 'checkIfChanged', 185, 186), +(95, 84, NULL, NULL, 'calculateFrequency', 187, 188), +(96, 84, NULL, NULL, 'delete', 189, 190), +(97, 84, NULL, NULL, 'checkDuplicateName', 191, 192), +(98, 2, NULL, NULL, 'Faculties', 194, 205), +(99, 98, NULL, NULL, 'index', 195, 196), +(100, 98, NULL, NULL, 'view', 197, 198), +(101, 98, NULL, NULL, 'add', 199, 200), +(102, 98, NULL, NULL, 'edit', 201, 202), +(103, 98, NULL, NULL, 'delete', 203, 204), +(104, 2, NULL, NULL, 'Framework', 206, 221), +(105, 104, NULL, NULL, 'calendarDisplay', 207, 208), +(106, 104, NULL, NULL, 'tutIndex', 209, 210), +(107, 104, NULL, NULL, 'add', 211, 212), +(108, 104, NULL, NULL, 'edit', 213, 214), +(109, 104, NULL, NULL, 'index', 215, 216), +(110, 104, NULL, NULL, 'view', 217, 218), +(111, 104, NULL, NULL, 'delete', 219, 220), +(112, 2, NULL, NULL, 'Groups', 222, 241), +(113, 112, NULL, NULL, 'setUpAjaxList', 223, 224), +(114, 112, NULL, NULL, 'index', 225, 226), +(115, 112, NULL, NULL, 'ajaxList', 227, 228), +(116, 112, NULL, NULL, 'view', 229, 230), +(117, 112, NULL, NULL, 'add', 231, 232), +(118, 112, NULL, NULL, 'edit', 233, 234), +(119, 112, NULL, NULL, 'delete', 235, 236), +(120, 112, NULL, NULL, 'import', 237, 238), +(121, 112, NULL, NULL, 'export', 239, 240), +(122, 2, NULL, NULL, 'Home', 242, 253), +(123, 122, NULL, NULL, 'index', 243, 244), +(124, 122, NULL, NULL, 'add', 245, 246), +(125, 122, NULL, NULL, 'edit', 247, 248), +(126, 122, NULL, NULL, 'view', 249, 250), +(127, 122, NULL, NULL, 'delete', 251, 252), +(128, 2, NULL, NULL, 'Install', 254, 275), +(129, 128, NULL, NULL, 'index', 255, 256), +(130, 128, NULL, NULL, 'install2', 257, 258), +(131, 128, NULL, NULL, 'install3', 259, 260), +(132, 128, NULL, NULL, 'install4', 261, 262), +(133, 128, NULL, NULL, 'install5', 263, 264), +(134, 128, NULL, NULL, 'gpl', 265, 266), +(135, 128, NULL, NULL, 'add', 267, 268), +(136, 128, NULL, NULL, 'edit', 269, 270), +(137, 128, NULL, NULL, 'view', 271, 272), +(138, 128, NULL, NULL, 'delete', 273, 274), +(139, 2, NULL, NULL, 'Lti', 276, 287), +(140, 139, NULL, NULL, 'index', 277, 278), +(141, 139, NULL, NULL, 'add', 279, 280), +(142, 139, NULL, NULL, 'edit', 281, 282), +(143, 139, NULL, NULL, 'view', 283, 284), +(144, 139, NULL, NULL, 'delete', 285, 286), +(145, 2, NULL, NULL, 'Mixevals', 288, 305), +(146, 145, NULL, NULL, 'setUpAjaxList', 289, 290), +(147, 145, NULL, NULL, 'index', 291, 292), +(148, 145, NULL, NULL, 'ajaxList', 293, 294), +(149, 145, NULL, NULL, 'view', 295, 296), +(150, 145, NULL, NULL, 'add', 297, 298), +(151, 145, NULL, NULL, 'edit', 299, 300), +(152, 145, NULL, NULL, 'copy', 301, 302), +(153, 145, NULL, NULL, 'delete', 303, 304), +(154, 2, NULL, NULL, 'Oauthclients', 306, 317), +(155, 154, NULL, NULL, 'index', 307, 308), +(156, 154, NULL, NULL, 'add', 309, 310), +(157, 154, NULL, NULL, 'edit', 311, 312), +(158, 154, NULL, NULL, 'delete', 313, 314), +(159, 154, NULL, NULL, 'view', 315, 316), +(160, 2, NULL, NULL, 'Oauthtokens', 318, 329), +(161, 160, NULL, NULL, 'index', 319, 320), +(162, 160, NULL, NULL, 'add', 321, 322), +(163, 160, NULL, NULL, 'edit', 323, 324), +(164, 160, NULL, NULL, 'delete', 325, 326), +(165, 160, NULL, NULL, 'view', 327, 328), +(166, 2, NULL, NULL, 'Penalty', 330, 343), +(167, 166, NULL, NULL, 'save', 331, 332), +(168, 166, NULL, NULL, 'add', 333, 334), +(169, 166, NULL, NULL, 'edit', 335, 336), +(170, 166, NULL, NULL, 'index', 337, 338), +(171, 166, NULL, NULL, 'view', 339, 340), +(172, 166, NULL, NULL, 'delete', 341, 342), +(173, 2, NULL, NULL, 'Rubrics', 344, 363), +(174, 173, NULL, NULL, 'postProcess', 345, 346), +(175, 173, NULL, NULL, 'setUpAjaxList', 347, 348), +(176, 173, NULL, NULL, 'index', 349, 350), +(177, 173, NULL, NULL, 'ajaxList', 351, 352), +(178, 173, NULL, NULL, 'view', 353, 354), +(179, 173, NULL, NULL, 'add', 355, 356), +(180, 173, NULL, NULL, 'edit', 357, 358), +(181, 173, NULL, NULL, 'copy', 359, 360), +(182, 173, NULL, NULL, 'delete', 361, 362), +(183, 2, NULL, NULL, 'Searchs', 364, 391), +(184, 183, NULL, NULL, 'update', 365, 366), +(185, 183, NULL, NULL, 'index', 367, 368), +(186, 183, NULL, NULL, 'searchEvaluation', 369, 370), +(187, 183, NULL, NULL, 'searchResult', 371, 372), +(188, 183, NULL, NULL, 'searchInstructor', 373, 374), +(189, 183, NULL, NULL, 'eventBoxSearch', 375, 376), +(190, 183, NULL, NULL, 'formatSearchEvaluation', 377, 378), +(191, 183, NULL, NULL, 'formatSearchInstructor', 379, 380), +(192, 183, NULL, NULL, 'formatSearchEvaluationResult', 381, 382), +(193, 183, NULL, NULL, 'add', 383, 384), +(194, 183, NULL, NULL, 'edit', 385, 386), +(195, 183, NULL, NULL, 'view', 387, 388), +(196, 183, NULL, NULL, 'delete', 389, 390), +(197, 2, NULL, NULL, 'Simpleevaluations', 392, 411), +(198, 197, NULL, NULL, 'postProcess', 393, 394), +(199, 197, NULL, NULL, 'setUpAjaxList', 395, 396), +(200, 197, NULL, NULL, 'index', 397, 398), +(201, 197, NULL, NULL, 'ajaxList', 399, 400), +(202, 197, NULL, NULL, 'view', 401, 402), +(203, 197, NULL, NULL, 'add', 403, 404), +(204, 197, NULL, NULL, 'edit', 405, 406), +(205, 197, NULL, NULL, 'copy', 407, 408), +(206, 197, NULL, NULL, 'delete', 409, 410), +(207, 2, NULL, NULL, 'Surveygroups', 412, 443), +(208, 207, NULL, NULL, 'postProcess', 413, 414), +(209, 207, NULL, NULL, 'setUpAjaxList', 415, 416), +(210, 207, NULL, NULL, 'index', 417, 418), +(211, 207, NULL, NULL, 'ajaxList', 419, 420), +(212, 207, NULL, NULL, 'makegroups', 421, 422), +(213, 207, NULL, NULL, 'makegroupssearch', 423, 424), +(214, 207, NULL, NULL, 'maketmgroups', 425, 426), +(215, 207, NULL, NULL, 'savegroups', 427, 428), +(216, 207, NULL, NULL, 'release', 429, 430), +(217, 207, NULL, NULL, 'delete', 431, 432), +(218, 207, NULL, NULL, 'edit', 433, 434), +(219, 207, NULL, NULL, 'changegroupset', 435, 436), +(220, 207, NULL, NULL, 'export', 437, 438), +(221, 207, NULL, NULL, 'add', 439, 440), +(222, 207, NULL, NULL, 'view', 441, 442), +(223, 2, NULL, NULL, 'Surveys', 444, 473), +(224, 223, NULL, NULL, 'setUpAjaxList', 445, 446), +(225, 223, NULL, NULL, 'index', 447, 448), +(226, 223, NULL, NULL, 'ajaxList', 449, 450), +(227, 223, NULL, NULL, 'view', 451, 452), +(228, 223, NULL, NULL, 'add', 453, 454), +(229, 223, NULL, NULL, 'edit', 455, 456), +(230, 223, NULL, NULL, 'copy', 457, 458), +(231, 223, NULL, NULL, 'delete', 459, 460), +(232, 223, NULL, NULL, 'questionsSummary', 461, 462), +(233, 223, NULL, NULL, 'moveQuestion', 463, 464), +(234, 223, NULL, NULL, 'removeQuestion', 465, 466), +(235, 223, NULL, NULL, 'addQuestion', 467, 468), +(236, 223, NULL, NULL, 'editQuestion', 469, 470), +(237, 223, NULL, NULL, 'surveyAccess', 471, 472), +(238, 2, NULL, NULL, 'Sysparameters', 474, 489), +(239, 238, NULL, NULL, 'setUpAjaxList', 475, 476), +(240, 238, NULL, NULL, 'index', 477, 478), +(241, 238, NULL, NULL, 'ajaxList', 479, 480), +(242, 238, NULL, NULL, 'view', 481, 482), +(243, 238, NULL, NULL, 'add', 483, 484), +(244, 238, NULL, NULL, 'edit', 485, 486), +(245, 238, NULL, NULL, 'delete', 487, 488), +(246, 2, NULL, NULL, 'Upgrade', 490, 503), +(247, 246, NULL, NULL, 'index', 491, 492), +(248, 246, NULL, NULL, 'step2', 493, 494), +(249, 246, NULL, NULL, 'add', 495, 496), +(250, 246, NULL, NULL, 'edit', 497, 498), +(251, 246, NULL, NULL, 'view', 499, 500), +(252, 246, NULL, NULL, 'delete', 501, 502), +(253, 2, NULL, NULL, 'Users', 504, 541), +(254, 253, NULL, NULL, 'ajaxList', 505, 506), +(255, 253, NULL, NULL, 'index', 507, 508), +(256, 253, NULL, NULL, 'goToClassList', 509, 510), +(257, 253, NULL, NULL, 'determineIfStudentFromThisData', 511, 512), +(258, 253, NULL, NULL, 'view', 513, 514), +(259, 253, NULL, NULL, 'add', 515, 516), +(260, 253, NULL, NULL, 'enrol', 517, 518), +(261, 253, NULL, NULL, 'edit', 519, 520), +(262, 253, NULL, NULL, 'editProfile', 521, 522), +(263, 253, NULL, NULL, 'delete', 523, 524), +(264, 253, NULL, NULL, 'checkDuplicateName', 525, 526), +(265, 253, NULL, NULL, 'resetPassword', 527, 528), +(266, 253, NULL, NULL, 'resetPasswordWithoutEmail', 529, 530), +(267, 253, NULL, NULL, 'import', 531, 532), +(268, 253, NULL, NULL, 'merge', 533, 534), +(269, 253, NULL, NULL, 'ajax_merge', 535, 536), +(270, 253, NULL, NULL, 'update', 537, 538), +(271, 253, NULL, NULL, 'showEvents', 539, 540), +(272, 2, NULL, NULL, 'V1', 542, 577), +(273, 272, NULL, NULL, 'oauth', 543, 544), +(274, 272, NULL, NULL, 'oauth_error', 545, 546), +(275, 272, NULL, NULL, 'users', 547, 548), +(276, 272, NULL, NULL, 'courses', 549, 550), +(277, 272, NULL, NULL, 'groups', 551, 552), +(278, 272, NULL, NULL, 'groupMembers', 553, 554), +(279, 272, NULL, NULL, 'events', 555, 556), +(280, 272, NULL, NULL, 'grades', 557, 558), +(281, 272, NULL, NULL, 'departments', 559, 560), +(282, 272, NULL, NULL, 'courseDepartments', 561, 562), +(283, 272, NULL, NULL, 'userEvents', 563, 564), +(284, 272, NULL, NULL, 'enrolment', 565, 566), +(285, 272, NULL, NULL, 'add', 567, 568), +(286, 272, NULL, NULL, 'edit', 569, 570), +(287, 272, NULL, NULL, 'index', 571, 572), +(288, 272, NULL, NULL, 'view', 573, 574), +(289, 272, NULL, NULL, 'delete', 575, 576), +(290, 2, NULL, NULL, 'Guard', 578, 595), +(291, 290, NULL, NULL, 'Guard', 579, 594), +(292, 291, NULL, NULL, 'login', 580, 581), +(293, 291, NULL, NULL, 'logout', 582, 583), +(294, 291, NULL, NULL, 'add', 584, 585), +(295, 291, NULL, NULL, 'edit', 586, 587), +(296, 291, NULL, NULL, 'index', 588, 589), +(297, 291, NULL, NULL, 'view', 590, 591), +(298, 291, NULL, NULL, 'delete', 592, 593), +(299, NULL, NULL, NULL, 'functions', 597, 662), +(300, 299, NULL, NULL, 'user', 598, 625), +(301, 300, NULL, NULL, 'superadmin', 599, 600), +(302, 300, NULL, NULL, 'admin', 601, 602), +(303, 300, NULL, NULL, 'instructor', 603, 604), +(304, 300, NULL, NULL, 'tutor', 605, 606), +(305, 300, NULL, NULL, 'student', 607, 608), +(306, 300, NULL, NULL, 'import', 609, 610), +(307, 300, NULL, NULL, 'password_reset', 611, 622), +(308, 307, NULL, NULL, 'superadmin', 612, 613), +(309, 307, NULL, NULL, 'admin', 614, 615), +(310, 307, NULL, NULL, 'instructor', 616, 617), +(311, 307, NULL, NULL, 'tutor', 618, 619), +(312, 307, NULL, NULL, 'student', 620, 621), +(313, 300, NULL, NULL, 'index', 623, 624), +(314, 299, NULL, NULL, 'role', 626, 637), +(315, 314, NULL, NULL, 'superadmin', 627, 628), +(316, 314, NULL, NULL, 'admin', 629, 630), +(317, 314, NULL, NULL, 'instructor', 631, 632), +(318, 314, NULL, NULL, 'tutor', 633, 634), +(319, 314, NULL, NULL, 'student', 635, 636), +(320, 299, NULL, NULL, 'evaluation', 638, 639), +(321, 299, NULL, NULL, 'email', 640, 647), +(322, 321, NULL, NULL, 'allUsers', 641, 642), +(323, 321, NULL, NULL, 'allGroups', 643, 644), +(324, 321, NULL, NULL, 'allCourses', 645, 646), +(325, 299, NULL, NULL, 'emailtemplate', 648, 649), +(326, 299, NULL, NULL, 'viewstudentresults', 650, 651), +(327, 299, NULL, NULL, 'viewemailaddresses', 652, 653), +(328, 299, NULL, NULL, 'superadmin', 654, 655), +(329, 299, NULL, NULL, 'coursemanager', 656, 657), +(330, 299, NULL, NULL, 'viewusername', 658, 659), +(331, 299, NULL, NULL, 'submitstudenteval', 660, 661); -- -------------------------------------------------------- @@ -427,123 +429,127 @@ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; INSERT INTO aros_acos (id, aro_id, aco_id, _create, _read, _update, _delete) VALUES -(1,1,2,'1','1','1','1'), -(2,1,298,'1','1','1','1'), -(3,1,1,'1','1','1','1'), -(4,2,2,'-1','-1','-1','-1'), -(5,2,56,'1','1','1','1'), -(6,2,242,'1','1','1','1'), -(7,2,198,'1','1','1','1'), -(8,2,201,'-1','-1','-1','-1'), -(9,2,200,'-1','-1','-1','-1'), -(10,2,203,'-1','-1','-1','-1'), -(11,2,202,'-1','-1','-1','-1'), -(12,2,199,'-1','-1','-1','-1'), -(13,2,275,'1','1','1','1'), -(14,2,221,'1','1','1','1'), -(15,2,117,'1','1','1','1'), -(16,2,91,'1','1','1','1'), -(17,2,156,'1','1','1','1'), -(18,2,130,'1','1','1','1'), -(19,2,212,'1','1','1','1'), -(20,2,146,'1','1','1','1'), -(21,2,170,'1','1','1','1'), -(22,2,254,'1','1','1','1'), -(23,2,68,'1','1','1','1'), -(24,2,24,'1','1','1','1'), -(25,2,292,'1','1','1','1'), -(26,2,298,'-1','-1','-1','-1'), -(27,2,324,'1','1','1','1'), -(28,2,319,'1','1','1','1'), -(29,2,321,'1','1','1','1'), -(30,2,299,'1','1','1','1'), -(31,2,301,'1','1','1','-1'), -(32,2,300,'-1','-1','-1','-1'), -(33,2,326,'1','1','1','1'), -(34,2,329,'1','1','1','1'), -(35,2,328,'1','1','1','1'), -(36,2,327,'-1','-1','-1','-1'), -(37,3,2,'-1','-1','-1','-1'), -(38,3,56,'1','1','1','1'), -(39,3,242,'1','1','1','1'), -(40,3,275,'1','1','1','1'), -(41,3,221,'1','1','1','1'), -(42,3,117,'1','1','1','1'), -(43,3,91,'1','1','1','1'), -(44,3,156,'1','1','1','1'), -(45,3,130,'1','1','1','1'), -(46,3,212,'1','1','1','1'), -(47,3,146,'1','1','1','1'), -(48,3,170,'1','1','1','1'), -(49,3,254,'1','1','1','1'), -(50,3,68,'1','1','1','1'), -(51,3,24,'1','1','1','1'), -(52,3,292,'1','1','1','1'), -(53,3,44,'1','1','1','1'), -(54,3,46,'1','1','1','1'), -(55,3,113,'1','1','1','1'), -(56,3,115,'1','1','1','1'), -(57,3,38,'-1','-1','-1','-1'), -(58,3,41,'1','1','1','1'), -(59,3,298,'-1','-1','-1','-1'), -(60,3,319,'1','1','-1','-1'), -(61,3,299,'1','1','1','1'), -(62,3,301,'-1','-1','-1','-1'), -(63,3,300,'-1','-1','-1','-1'), -(64,3,302,'-1','1','-1','-1'), -(65,3,312,'-1','-1','-1','-1'), -(66,3,326,'-1','-1','-1','-1'), -(67,3,327,'-1','-1','-1','-1'), -(68,3,328,'1','1','1','1'), -(69,4,2,'-1','-1','-1','-1'), -(70,4,56,'1','1','1','1'), -(71,4,242,'-1','-1','-1','-1'), -(72,4,275,'-1','-1','-1','-1'), -(73,4,221,'-1','-1','-1','-1'), -(74,4,117,'-1','-1','-1','-1'), -(75,4,156,'-1','-1','-1','-1'), -(76,4,130,'-1','-1','-1','-1'), -(77,4,212,'-1','-1','-1','-1'), -(78,4,146,'-1','-1','-1','-1'), -(79,4,170,'-1','-1','-1','-1'), -(80,4,254,'-1','-1','-1','-1'), -(81,4,68,'-1','-1','-1','-1'), -(82,4,24,'-1','-1','-1','-1'), -(83,4,292,'1','1','1','1'), -(84,4,97,'1','1','1','1'), -(85,4,100,'1','1','1','1'), -(86,4,98,'1','1','1','1'), -(87,4,33,'1','1','1','1'), -(88,4,298,'-1','-1','-1','-1'), -(89,4,326,'-1','-1','-1','-1'), -(90,4,327,'-1','-1','-1','-1'), -(91,5,2,'-1','-1','-1','-1'), -(92,5,56,'1','1','1','1'), -(93,5,242,'-1','-1','-1','-1'), -(94,5,275,'-1','-1','-1','-1'), -(95,5,221,'-1','-1','-1','-1'), -(96,5,117,'-1','-1','-1','-1'), -(97,5,156,'-1','-1','-1','-1'), -(98,5,130,'-1','-1','-1','-1'), -(99,5,212,'-1','-1','-1','-1'), -(100,5,146,'-1','-1','-1','-1'), -(101,5,170,'-1','-1','-1','-1'), -(102,5,254,'-1','-1','-1','-1'), -(103,5,68,'-1','-1','-1','-1'), -(104,5,24,'-1','-1','-1','-1'), -(105,5,292,'1','1','1','1'), -(106,5,97,'1','1','1','1'), -(107,5,100,'1','1','1','1'), -(108,5,98,'1','1','1','1'), -(109,5,33,'1','1','1','1'), -(110,5,44,'1','1','1','1'), -(111,5,46,'1','1','1','1'), -(112,5,113,'1','1','1','1'), -(113,5,115,'1','1','1','1'), -(114,5,298,'-1','-1','-1','-1'), -(115,5,325,'1','1','1','1'), -(116,5,326,'-1','-1','-1','-1'), -(117,5,327,'-1','-1','-1','-1'); +(1, 1, 2, '1', '1', '1', '1'), +(2, 1, 299, '1', '1', '1', '1'), +(3, 1, 1, '1', '1', '1', '1'), +(4, 2, 2, '-1', '-1', '-1', '-1'), +(5, 2, 122, '1', '1', '1', '1'), +(6, 2, 16, '1', '1', '1', '1'), +(7, 2, 28, '1', '1', '1', '1'), +(8, 2, 31, '-1', '-1', '-1', '-1'), +(9, 2, 30, '-1', '-1', '-1', '-1'), +(10, 2, 33, '-1', '-1', '-1', '-1'), +(11, 2, 32, '-1', '-1', '-1', '-1'), +(12, 2, 29, '-1', '-1', '-1', '-1'), +(13, 2, 34, '1', '1', '1', '1'), +(14, 2, 48, '1', '1', '1', '1'), +(15, 2, 58, '1', '1', '1', '1'), +(16, 2, 64, '1', '1', '1', '1'), +(17, 2, 84, '1', '1', '1', '1'), +(18, 2, 112, '1', '1', '1', '1'), +(19, 2, 145, '1', '1', '1', '1'), +(20, 2, 173, '1', '1', '1', '1'), +(21, 2, 197, '1', '1', '1', '1'), +(22, 2, 223, '1', '1', '1', '1'), +(23, 2, 207, '1', '1', '1', '1'), +(24, 2, 253, '1', '1', '1', '1'), +(25, 2, 266, '-1', '-1', '-1', '-1'), +(26, 2, 293, '1', '1', '1', '1'), +(27, 2, 299, '-1', '-1', '-1', '-1'), +(28, 2, 325, '1', '1', '1', '1'), +(29, 2, 320, '1', '1', '1', '1'), +(30, 2, 322, '1', '1', '1', '1'), +(31, 2, 300, '1', '1', '1', '1'), +(32, 2, 302, '1', '1', '1', '-1'), +(33, 2, 301, '-1', '-1', '-1', '-1'), +(34, 2, 327, '1', '1', '1', '1'), +(35, 2, 330, '1', '1', '1', '1'), +(36, 2, 329, '1', '1', '1', '1'), +(37, 2, 328, '-1', '-1', '-1', '-1'), +(38, 2, 331, '1', '1', '1', '1'), +(39, 3, 2, '-1', '-1', '-1', '-1'), +(40, 3, 122, '1', '1', '1', '1'), +(41, 3, 16, '1', '1', '1', '1'), +(42, 3, 34, '1', '1', '1', '1'), +(43, 3, 48, '1', '1', '1', '1'), +(44, 3, 58, '1', '1', '1', '1'), +(45, 3, 64, '1', '1', '1', '1'), +(46, 3, 84, '1', '1', '1', '1'), +(47, 3, 112, '1', '1', '1', '1'), +(48, 3, 145, '1', '1', '1', '1'), +(49, 3, 173, '1', '1', '1', '1'), +(50, 3, 197, '1', '1', '1', '1'), +(51, 3, 223, '1', '1', '1', '1'), +(52, 3, 207, '1', '1', '1', '1'), +(53, 3, 253, '1', '1', '1', '1'), +(54, 3, 293, '1', '1', '1', '1'), +(55, 3, 156, '1', '1', '1', '1'), +(56, 3, 158, '1', '1', '1', '1'), +(57, 3, 162, '1', '1', '1', '1'), +(58, 3, 164, '1', '1', '1', '1'), +(59, 3, 268, '-1', '-1', '-1', '-1'), +(60, 3, 271, '1', '1', '1', '1'), +(61, 3, 266, '-1', '-1', '-1', '-1'), +(62, 3, 299, '-1', '-1', '-1', '-1'), +(63, 3, 320, '1', '1', '-1', '-1'), +(64, 3, 300, '1', '1', '1', '1'), +(65, 3, 302, '-1', '-1', '-1', '-1'), +(66, 3, 301, '-1', '-1', '-1', '-1'), +(67, 3, 303, '-1', '1', '-1', '-1'), +(68, 3, 313, '-1', '-1', '-1', '-1'), +(69, 3, 327, '-1', '-1', '-1', '-1'), +(70, 3, 328, '-1', '-1', '-1', '-1'), +(71, 3, 329, '1', '1', '1', '1'), +(72, 3, 331, '-1', '-1', '-1', '-1'), +(73, 4, 2, '-1', '-1', '-1', '-1'), +(74, 4, 122, '1', '1', '1', '1'), +(75, 4, 16, '-1', '-1', '-1', '-1'), +(76, 4, 34, '-1', '-1', '-1', '-1'), +(77, 4, 48, '-1', '-1', '-1', '-1'), +(78, 4, 58, '-1', '-1', '-1', '-1'), +(79, 4, 84, '-1', '-1', '-1', '-1'), +(80, 4, 112, '-1', '-1', '-1', '-1'), +(81, 4, 145, '-1', '-1', '-1', '-1'), +(82, 4, 173, '-1', '-1', '-1', '-1'), +(83, 4, 197, '-1', '-1', '-1', '-1'), +(84, 4, 223, '-1', '-1', '-1', '-1'), +(85, 4, 207, '-1', '-1', '-1', '-1'), +(86, 4, 253, '-1', '-1', '-1', '-1'), +(87, 4, 293, '1', '1', '1', '1'), +(88, 4, 70, '1', '1', '1', '1'), +(89, 4, 73, '1', '1', '1', '1'), +(90, 4, 71, '1', '1', '1', '1'), +(91, 4, 262, '1', '1', '1', '1'), +(92, 4, 299, '-1', '-1', '-1', '-1'), +(93, 4, 327, '-1', '-1', '-1', '-1'), +(94, 4, 328, '-1', '-1', '-1', '-1'), +(95, 5, 2, '-1', '-1', '-1', '-1'), +(96, 5, 122, '1', '1', '1', '1'), +(97, 5, 16, '-1', '-1', '-1', '-1'), +(98, 5, 34, '-1', '-1', '-1', '-1'), +(99, 5, 48, '-1', '-1', '-1', '-1'), +(100, 5, 58, '-1', '-1', '-1', '-1'), +(101, 5, 84, '-1', '-1', '-1', '-1'), +(102, 5, 112, '-1', '-1', '-1', '-1'), +(103, 5, 145, '-1', '-1', '-1', '-1'), +(104, 5, 173, '-1', '-1', '-1', '-1'), +(105, 5, 197, '-1', '-1', '-1', '-1'), +(106, 5, 223, '-1', '-1', '-1', '-1'), +(107, 5, 207, '-1', '-1', '-1', '-1'), +(108, 5, 253, '-1', '-1', '-1', '-1'), +(109, 5, 293, '1', '1', '1', '1'), +(110, 5, 70, '1', '1', '1', '1'), +(111, 5, 73, '1', '1', '1', '1'), +(112, 5, 71, '1', '1', '1', '1'), +(113, 5, 262, '1', '1', '1', '1'), +(114, 5, 156, '1', '1', '1', '1'), +(115, 5, 158, '1', '1', '1', '1'), +(116, 5, 162, '1', '1', '1', '1'), +(117, 5, 164, '1', '1', '1', '1'), +(118, 5, 299, '-1', '-1', '-1', '-1'), +(119, 5, 326, '1', '1', '1', '1'), +(120, 5, 327, '-1', '-1', '-1', '-1'), +(121, 5, 328, '-1', '-1', '-1', '-1'); -- -------------------------------------------------------- diff --git a/app/config/sql/ipeer_samples_data.sql b/app/config/sql/ipeer_samples_data.sql index 3738ebf4e..aec545a51 100644 --- a/app/config/sql/ipeer_samples_data.sql +++ b/app/config/sql/ipeer_samples_data.sql @@ -36,335 +36,337 @@ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101 SET NAMES utf8 */; INSERT INTO acos (id, parent_id, model, foreign_key, alias, lft, rght) VALUES -(1,NULL,NULL,NULL,'adminpage',1,2), -(2,NULL,NULL,NULL,'controllers',3,594), -(3,2,NULL,NULL,'Pages',4,17), -(4,3,NULL,NULL,'display',5,6), -(5,3,NULL,NULL,'add',7,8), -(6,3,NULL,NULL,'edit',9,10), -(7,3,NULL,NULL,'index',11,12), -(8,3,NULL,NULL,'view',13,14), -(9,3,NULL,NULL,'delete',15,16), -(10,2,NULL,NULL,'Searchs',18,45), -(11,10,NULL,NULL,'update',19,20), -(12,10,NULL,NULL,'index',21,22), -(13,10,NULL,NULL,'searchEvaluation',23,24), -(14,10,NULL,NULL,'searchResult',25,26), -(15,10,NULL,NULL,'searchInstructor',27,28), -(16,10,NULL,NULL,'eventBoxSearch',29,30), -(17,10,NULL,NULL,'formatSearchEvaluation',31,32), -(18,10,NULL,NULL,'formatSearchInstructor',33,34), -(19,10,NULL,NULL,'formatSearchEvaluationResult',35,36), -(20,10,NULL,NULL,'add',37,38), -(21,10,NULL,NULL,'edit',39,40), -(22,10,NULL,NULL,'view',41,42), -(23,10,NULL,NULL,'delete',43,44), -(24,2,NULL,NULL,'Users',46,81), -(25,24,NULL,NULL,'ajaxList',47,48), -(26,24,NULL,NULL,'index',49,50), -(27,24,NULL,NULL,'goToClassList',51,52), -(28,24,NULL,NULL,'determineIfStudentFromThisData',53,54), -(29,24,NULL,NULL,'view',55,56), -(30,24,NULL,NULL,'add',57,58), -(31,24,NULL,NULL,'enrol',59,60), -(32,24,NULL,NULL,'edit',61,62), -(33,24,NULL,NULL,'editProfile',63,64), -(34,24,NULL,NULL,'delete',65,66), -(35,24,NULL,NULL,'checkDuplicateName',67,68), -(36,24,NULL,NULL,'resetPassword',69,70), -(37,24,NULL,NULL,'import',71,72), -(38,24,NULL,NULL,'merge',73,74), -(39,24,NULL,NULL,'ajax_merge',75,76), -(40,24,NULL,NULL,'update',77,78), -(41,24,NULL,NULL,'showEvents',79,80), -(42,2,NULL,NULL,'Oauthclients',82,93), -(43,42,NULL,NULL,'index',83,84), -(44,42,NULL,NULL,'add',85,86), -(45,42,NULL,NULL,'edit',87,88), -(46,42,NULL,NULL,'delete',89,90), -(47,42,NULL,NULL,'view',91,92), -(48,2,NULL,NULL,'Framework',94,109), -(49,48,NULL,NULL,'calendarDisplay',95,96), -(50,48,NULL,NULL,'tutIndex',97,98), -(51,48,NULL,NULL,'add',99,100), -(52,48,NULL,NULL,'edit',101,102), -(53,48,NULL,NULL,'index',103,104), -(54,48,NULL,NULL,'view',105,106), -(55,48,NULL,NULL,'delete',107,108), -(56,2,NULL,NULL,'Home',110,121), -(57,56,NULL,NULL,'index',111,112), -(58,56,NULL,NULL,'add',113,114), -(59,56,NULL,NULL,'edit',115,116), -(60,56,NULL,NULL,'view',117,118), -(61,56,NULL,NULL,'delete',119,120), -(62,2,NULL,NULL,'Accesses',122,133), -(63,62,NULL,NULL,'view',123,124), -(64,62,NULL,NULL,'edit',125,126), -(65,62,NULL,NULL,'add',127,128), -(66,62,NULL,NULL,'index',129,130), -(67,62,NULL,NULL,'delete',131,132), -(68,2,NULL,NULL,'Surveygroups',134,165), -(69,68,NULL,NULL,'postProcess',135,136), -(70,68,NULL,NULL,'setUpAjaxList',137,138), -(71,68,NULL,NULL,'index',139,140), -(72,68,NULL,NULL,'ajaxList',141,142), -(73,68,NULL,NULL,'makegroups',143,144), -(74,68,NULL,NULL,'makegroupssearch',145,146), -(75,68,NULL,NULL,'maketmgroups',147,148), -(76,68,NULL,NULL,'savegroups',149,150), -(77,68,NULL,NULL,'release',151,152), -(78,68,NULL,NULL,'delete',153,154), -(79,68,NULL,NULL,'edit',155,156), -(80,68,NULL,NULL,'changegroupset',157,158), -(81,68,NULL,NULL,'export',159,160), -(82,68,NULL,NULL,'add',161,162), -(83,68,NULL,NULL,'view',163,164), -(84,2,NULL,NULL,'Upgrade',166,179), -(85,84,NULL,NULL,'index',167,168), -(86,84,NULL,NULL,'step2',169,170), -(87,84,NULL,NULL,'add',171,172), -(88,84,NULL,NULL,'edit',173,174), -(89,84,NULL,NULL,'view',175,176), -(90,84,NULL,NULL,'delete',177,178), -(91,2,NULL,NULL,'Evaluations',180,219), -(92,91,NULL,NULL,'setUpAjaxList',181,182), -(93,91,NULL,NULL,'ajaxList',183,184), -(94,91,NULL,NULL,'view',185,186), -(95,91,NULL,NULL,'index',187,188), -(96,91,NULL,NULL,'export',189,190), -(97,91,NULL,NULL,'makeEvaluation',191,192), -(98,91,NULL,NULL,'completeEvaluationRubric',193,194), -(99,91,NULL,NULL,'viewEvaluationResults',195,196), -(100,91,NULL,NULL,'studentViewEvaluationResult',197,198), -(101,91,NULL,NULL,'markEventReviewed',199,200), -(102,91,NULL,NULL,'markGradeRelease',201,202), -(103,91,NULL,NULL,'markCommentRelease',203,204), -(104,91,NULL,NULL,'changeAllCommentRelease',205,206), -(105,91,NULL,NULL,'changeAllGradeRelease',207,208), -(106,91,NULL,NULL,'viewGroupSubmissionDetails',209,210), -(107,91,NULL,NULL,'viewSurveySummary',211,212), -(108,91,NULL,NULL,'add',213,214), -(109,91,NULL,NULL,'edit',215,216), -(110,91,NULL,NULL,'delete',217,218), -(111,2,NULL,NULL,'Oauthtokens',220,231), -(112,111,NULL,NULL,'index',221,222), -(113,111,NULL,NULL,'add',223,224), -(114,111,NULL,NULL,'edit',225,226), -(115,111,NULL,NULL,'delete',227,228), -(116,111,NULL,NULL,'view',229,230), -(117,2,NULL,NULL,'Evaltools',232,243), -(118,117,NULL,NULL,'index',233,234), -(119,117,NULL,NULL,'add',235,236), -(120,117,NULL,NULL,'edit',237,238), -(121,117,NULL,NULL,'view',239,240), -(122,117,NULL,NULL,'delete',241,242), -(123,2,NULL,NULL,'Penalty',244,257), -(124,123,NULL,NULL,'save',245,246), -(125,123,NULL,NULL,'add',247,248), -(126,123,NULL,NULL,'edit',249,250), -(127,123,NULL,NULL,'index',251,252), -(128,123,NULL,NULL,'view',253,254), -(129,123,NULL,NULL,'delete',255,256), -(130,2,NULL,NULL,'Groups',258,277), -(131,130,NULL,NULL,'setUpAjaxList',259,260), -(132,130,NULL,NULL,'index',261,262), -(133,130,NULL,NULL,'ajaxList',263,264), -(134,130,NULL,NULL,'view',265,266), -(135,130,NULL,NULL,'add',267,268), -(136,130,NULL,NULL,'edit',269,270), -(137,130,NULL,NULL,'delete',271,272), -(138,130,NULL,NULL,'import',273,274), -(139,130,NULL,NULL,'export',275,276), -(140,2,NULL,NULL,'Faculties',278,289), -(141,140,NULL,NULL,'index',279,280), -(142,140,NULL,NULL,'view',281,282), -(143,140,NULL,NULL,'add',283,284), -(144,140,NULL,NULL,'edit',285,286), -(145,140,NULL,NULL,'delete',287,288), -(146,2,NULL,NULL,'Rubrics',290,309), -(147,146,NULL,NULL,'postProcess',291,292), -(148,146,NULL,NULL,'setUpAjaxList',293,294), -(149,146,NULL,NULL,'index',295,296), -(150,146,NULL,NULL,'ajaxList',297,298), -(151,146,NULL,NULL,'view',299,300), -(152,146,NULL,NULL,'add',301,302), -(153,146,NULL,NULL,'edit',303,304), -(154,146,NULL,NULL,'copy',305,306), -(155,146,NULL,NULL,'delete',307,308), -(156,2,NULL,NULL,'Events',310,337), -(157,156,NULL,NULL,'postProcessData',311,312), -(158,156,NULL,NULL,'setUpAjaxList',313,314), -(159,156,NULL,NULL,'index',315,316), -(160,156,NULL,NULL,'ajaxList',317,318), -(161,156,NULL,NULL,'view',319,320), -(162,156,NULL,NULL,'add',321,322), -(163,156,NULL,NULL,'setSchedule',323,324), -(164,156,NULL,NULL,'getGroupMembers',325,326), -(165,156,NULL,NULL,'edit',327,328), -(166,156,NULL,NULL,'checkIfChanged',329,330), -(167,156,NULL,NULL,'calculateFrequency',331,332), -(168,156,NULL,NULL,'delete',333,334), -(169,156,NULL,NULL,'checkDuplicateName',335,336), -(170,2,NULL,NULL,'Simpleevaluations',338,357), -(171,170,NULL,NULL,'postProcess',339,340), -(172,170,NULL,NULL,'setUpAjaxList',341,342), -(173,170,NULL,NULL,'index',343,344), -(174,170,NULL,NULL,'ajaxList',345,346), -(175,170,NULL,NULL,'view',347,348), -(176,170,NULL,NULL,'add',349,350), -(177,170,NULL,NULL,'edit',351,352), -(178,170,NULL,NULL,'copy',353,354), -(179,170,NULL,NULL,'delete',355,356), -(180,2,NULL,NULL,'V1',358,393), -(181,180,NULL,NULL,'oauth',359,360), -(182,180,NULL,NULL,'oauth_error',361,362), -(183,180,NULL,NULL,'users',363,364), -(184,180,NULL,NULL,'courses',365,366), -(185,180,NULL,NULL,'groups',367,368), -(186,180,NULL,NULL,'groupMembers',369,370), -(187,180,NULL,NULL,'events',371,372), -(188,180,NULL,NULL,'grades',373,374), -(189,180,NULL,NULL,'departments',375,376), -(190,180,NULL,NULL,'courseDepartments',377,378), -(191,180,NULL,NULL,'userEvents',379,380), -(192,180,NULL,NULL,'enrolment',381,382), -(193,180,NULL,NULL,'add',383,384), -(194,180,NULL,NULL,'edit',385,386), -(195,180,NULL,NULL,'index',387,388), -(196,180,NULL,NULL,'view',389,390), -(197,180,NULL,NULL,'delete',391,392), -(198,2,NULL,NULL,'Departments',394,405), -(199,198,NULL,NULL,'index',395,396), -(200,198,NULL,NULL,'view',397,398), -(201,198,NULL,NULL,'add',399,400), -(202,198,NULL,NULL,'edit',401,402), -(203,198,NULL,NULL,'delete',403,404), -(204,2,NULL,NULL,'Sysparameters',406,421), -(205,204,NULL,NULL,'setUpAjaxList',407,408), -(206,204,NULL,NULL,'index',409,410), -(207,204,NULL,NULL,'ajaxList',411,412), -(208,204,NULL,NULL,'view',413,414), -(209,204,NULL,NULL,'add',415,416), -(210,204,NULL,NULL,'edit',417,418), -(211,204,NULL,NULL,'delete',419,420), -(212,2,NULL,NULL,'Mixevals',422,439), -(213,212,NULL,NULL,'setUpAjaxList',423,424), -(214,212,NULL,NULL,'index',425,426), -(215,212,NULL,NULL,'ajaxList',427,428), -(216,212,NULL,NULL,'view',429,430), -(217,212,NULL,NULL,'add',431,432), -(218,212,NULL,NULL,'edit',433,434), -(219,212,NULL,NULL,'copy',435,436), -(220,212,NULL,NULL,'delete',437,438), -(221,2,NULL,NULL,'Emailtemplates',440,459), -(222,221,NULL,NULL,'setUpAjaxList',441,442), -(223,221,NULL,NULL,'ajaxList',443,444), -(224,221,NULL,NULL,'index',445,446), -(225,221,NULL,NULL,'add',447,448), -(226,221,NULL,NULL,'edit',449,450), -(227,221,NULL,NULL,'delete',451,452), -(228,221,NULL,NULL,'view',453,454), -(229,221,NULL,NULL,'displayTemplateContent',455,456), -(230,221,NULL,NULL,'displayTemplateSubject',457,458), -(231,2,NULL,NULL,'Install',460,481), -(232,231,NULL,NULL,'index',461,462), -(233,231,NULL,NULL,'install2',463,464), -(234,231,NULL,NULL,'install3',465,466), -(235,231,NULL,NULL,'install4',467,468), -(236,231,NULL,NULL,'install5',469,470), -(237,231,NULL,NULL,'gpl',471,472), -(238,231,NULL,NULL,'add',473,474), -(239,231,NULL,NULL,'edit',475,476), -(240,231,NULL,NULL,'view',477,478), -(241,231,NULL,NULL,'delete',479,480), -(242,2,NULL,NULL,'Courses',482,505), -(243,242,NULL,NULL,'daysLate',483,484), -(244,242,NULL,NULL,'index',485,486), -(245,242,NULL,NULL,'ajaxList',487,488), -(246,242,NULL,NULL,'view',489,490), -(247,242,NULL,NULL,'home',491,492), -(248,242,NULL,NULL,'add',493,494), -(249,242,NULL,NULL,'edit',495,496), -(250,242,NULL,NULL,'delete',497,498), -(251,242,NULL,NULL,'move',499,500), -(252,242,NULL,NULL,'ajax_options',501,502), -(253,242,NULL,NULL,'import',503,504), -(254,2,NULL,NULL,'Surveys',506,535), -(255,254,NULL,NULL,'setUpAjaxList',507,508), -(256,254,NULL,NULL,'index',509,510), -(257,254,NULL,NULL,'ajaxList',511,512), -(258,254,NULL,NULL,'view',513,514), -(259,254,NULL,NULL,'add',515,516), -(260,254,NULL,NULL,'edit',517,518), -(261,254,NULL,NULL,'copy',519,520), -(262,254,NULL,NULL,'delete',521,522), -(263,254,NULL,NULL,'questionsSummary',523,524), -(264,254,NULL,NULL,'moveQuestion',525,526), -(265,254,NULL,NULL,'removeQuestion',527,528), -(266,254,NULL,NULL,'addQuestion',529,530), -(267,254,NULL,NULL,'editQuestion',531,532), -(268,254,NULL,NULL,'surveyAccess',533,534), -(269,2,NULL,NULL,'Lti',536,547), -(270,269,NULL,NULL,'index',537,538), -(271,269,NULL,NULL,'add',539,540), -(272,269,NULL,NULL,'edit',541,542), -(273,269,NULL,NULL,'view',543,544), -(274,269,NULL,NULL,'delete',545,546), -(275,2,NULL,NULL,'Emailer',548,575), -(276,275,NULL,NULL,'setUpAjaxList',549,550), -(277,275,NULL,NULL,'ajaxList',551,552), -(278,275,NULL,NULL,'index',553,554), -(279,275,NULL,NULL,'write',555,556), -(280,275,NULL,NULL,'cancel',557,558), -(281,275,NULL,NULL,'view',559,560), -(282,275,NULL,NULL,'addRecipient',561,562), -(283,275,NULL,NULL,'deleteRecipient',563,564), -(284,275,NULL,NULL,'getRecipient',565,566), -(285,275,NULL,NULL,'searchByUserId',567,568), -(286,275,NULL,NULL,'add',569,570), -(287,275,NULL,NULL,'edit',571,572), -(288,275,NULL,NULL,'delete',573,574), -(289,2,NULL,NULL,'Guard',576,593), -(290,289,NULL,NULL,'Guard',577,592), -(291,290,NULL,NULL,'login',578,579), -(292,290,NULL,NULL,'logout',580,581), -(293,290,NULL,NULL,'add',582,583), -(294,290,NULL,NULL,'edit',584,585), -(295,290,NULL,NULL,'index',586,587), -(296,290,NULL,NULL,'view',588,589), -(297,290,NULL,NULL,'delete',590,591), -(298,NULL,NULL,NULL,'functions',595,658), -(299,298,NULL,NULL,'user',596,623), -(300,299,NULL,NULL,'superadmin',597,598), -(301,299,NULL,NULL,'admin',599,600), -(302,299,NULL,NULL,'instructor',601,602), -(303,299,NULL,NULL,'tutor',603,604), -(304,299,NULL,NULL,'student',605,606), -(305,299,NULL,NULL,'import',607,608), -(306,299,NULL,NULL,'password_reset',609,620), -(307,306,NULL,NULL,'superadmin',610,611), -(308,306,NULL,NULL,'admin',612,613), -(309,306,NULL,NULL,'instructor',614,615), -(310,306,NULL,NULL,'tutor',616,617), -(311,306,NULL,NULL,'student',618,619), -(312,299,NULL,NULL,'index',621,622), -(313,298,NULL,NULL,'role',624,635), -(314,313,NULL,NULL,'superadmin',625,626), -(315,313,NULL,NULL,'admin',627,628), -(316,313,NULL,NULL,'instructor',629,630), -(317,313,NULL,NULL,'tutor',631,632), -(318,313,NULL,NULL,'student',633,634), -(319,298,NULL,NULL,'evaluation',636,637), -(320,298,NULL,NULL,'email',638,645), -(321,320,NULL,NULL,'allUsers',639,640), -(322,320,NULL,NULL,'allGroups',641,642), -(323,320,NULL,NULL,'allCourses',643,644), -(324,298,NULL,NULL,'emailtemplate',646,647), -(325,298,NULL,NULL,'viewstudentresults',648,649), -(326,298,NULL,NULL,'viewemailaddresses',650,651), -(327,298,NULL,NULL,'superadmin',652,653), -(328,298,NULL,NULL,'coursemanager',654,655), -(329,298,NULL,NULL,'viewusername',656,657); +(1, NULL, NULL, NULL, 'adminpage', 1, 2), +(2, NULL, NULL, NULL, 'controllers', 3, 596), +(3, 2, NULL, NULL, 'Pages', 4, 17), +(4, 3, NULL, NULL, 'display', 5, 6), +(5, 3, NULL, NULL, 'add', 7, 8), +(6, 3, NULL, NULL, 'edit', 9, 10), +(7, 3, NULL, NULL, 'index', 11, 12), +(8, 3, NULL, NULL, 'view', 13, 14), +(9, 3, NULL, NULL, 'delete', 15, 16), +(10, 2, NULL, NULL, 'Accesses', 18, 29), +(11, 10, NULL, NULL, 'view', 19, 20), +(12, 10, NULL, NULL, 'edit', 21, 22), +(13, 10, NULL, NULL, 'add', 23, 24), +(14, 10, NULL, NULL, 'index', 25, 26), +(15, 10, NULL, NULL, 'delete', 27, 28), +(16, 2, NULL, NULL, 'Courses', 30, 53), +(17, 16, NULL, NULL, 'daysLate', 31, 32), +(18, 16, NULL, NULL, 'index', 33, 34), +(19, 16, NULL, NULL, 'ajaxList', 35, 36), +(20, 16, NULL, NULL, 'view', 37, 38), +(21, 16, NULL, NULL, 'home', 39, 40), +(22, 16, NULL, NULL, 'add', 41, 42), +(23, 16, NULL, NULL, 'edit', 43, 44), +(24, 16, NULL, NULL, 'delete', 45, 46), +(25, 16, NULL, NULL, 'move', 47, 48), +(26, 16, NULL, NULL, 'ajax_options', 49, 50), +(27, 16, NULL, NULL, 'import', 51, 52), +(28, 2, NULL, NULL, 'Departments', 54, 65), +(29, 28, NULL, NULL, 'index', 55, 56), +(30, 28, NULL, NULL, 'view', 57, 58), +(31, 28, NULL, NULL, 'add', 59, 60), +(32, 28, NULL, NULL, 'edit', 61, 62), +(33, 28, NULL, NULL, 'delete', 63, 64), +(34, 2, NULL, NULL, 'Emailer', 66, 93), +(35, 34, NULL, NULL, 'setUpAjaxList', 67, 68), +(36, 34, NULL, NULL, 'ajaxList', 69, 70), +(37, 34, NULL, NULL, 'index', 71, 72), +(38, 34, NULL, NULL, 'write', 73, 74), +(39, 34, NULL, NULL, 'cancel', 75, 76), +(40, 34, NULL, NULL, 'view', 77, 78), +(41, 34, NULL, NULL, 'addRecipient', 79, 80), +(42, 34, NULL, NULL, 'deleteRecipient', 81, 82), +(43, 34, NULL, NULL, 'getRecipient', 83, 84), +(44, 34, NULL, NULL, 'searchByUserId', 85, 86), +(45, 34, NULL, NULL, 'add', 87, 88), +(46, 34, NULL, NULL, 'edit', 89, 90), +(47, 34, NULL, NULL, 'delete', 91, 92), +(48, 2, NULL, NULL, 'Emailtemplates', 94, 113), +(49, 48, NULL, NULL, 'setUpAjaxList', 95, 96), +(50, 48, NULL, NULL, 'ajaxList', 97, 98), +(51, 48, NULL, NULL, 'index', 99, 100), +(52, 48, NULL, NULL, 'add', 101, 102), +(53, 48, NULL, NULL, 'edit', 103, 104), +(54, 48, NULL, NULL, 'delete', 105, 106), +(55, 48, NULL, NULL, 'view', 107, 108), +(56, 48, NULL, NULL, 'displayTemplateContent', 109, 110), +(57, 48, NULL, NULL, 'displayTemplateSubject', 111, 112), +(58, 2, NULL, NULL, 'Evaltools', 114, 125), +(59, 58, NULL, NULL, 'index', 115, 116), +(60, 58, NULL, NULL, 'add', 117, 118), +(61, 58, NULL, NULL, 'edit', 119, 120), +(62, 58, NULL, NULL, 'view', 121, 122), +(63, 58, NULL, NULL, 'delete', 123, 124), +(64, 2, NULL, NULL, 'Evaluations', 126, 165), +(65, 64, NULL, NULL, 'setUpAjaxList', 127, 128), +(66, 64, NULL, NULL, 'ajaxList', 129, 130), +(67, 64, NULL, NULL, 'view', 131, 132), +(68, 64, NULL, NULL, 'index', 133, 134), +(69, 64, NULL, NULL, 'export', 135, 136), +(70, 64, NULL, NULL, 'makeEvaluation', 137, 138), +(71, 64, NULL, NULL, 'completeEvaluationRubric', 139, 140), +(72, 64, NULL, NULL, 'viewEvaluationResults', 141, 142), +(73, 64, NULL, NULL, 'studentViewEvaluationResult', 143, 144), +(74, 64, NULL, NULL, 'markEventReviewed', 145, 146), +(75, 64, NULL, NULL, 'markGradeRelease', 147, 148), +(76, 64, NULL, NULL, 'markCommentRelease', 149, 150), +(77, 64, NULL, NULL, 'changeAllCommentRelease', 151, 152), +(78, 64, NULL, NULL, 'changeAllGradeRelease', 153, 154), +(79, 64, NULL, NULL, 'viewGroupSubmissionDetails', 155, 156), +(80, 64, NULL, NULL, 'viewSurveySummary', 157, 158), +(81, 64, NULL, NULL, 'add', 159, 160), +(82, 64, NULL, NULL, 'edit', 161, 162), +(83, 64, NULL, NULL, 'delete', 163, 164), +(84, 2, NULL, NULL, 'Events', 166, 193), +(85, 84, NULL, NULL, 'postProcessData', 167, 168), +(86, 84, NULL, NULL, 'setUpAjaxList', 169, 170), +(87, 84, NULL, NULL, 'index', 171, 172), +(88, 84, NULL, NULL, 'ajaxList', 173, 174), +(89, 84, NULL, NULL, 'view', 175, 176), +(90, 84, NULL, NULL, 'add', 177, 178), +(91, 84, NULL, NULL, 'setSchedule', 179, 180), +(92, 84, NULL, NULL, 'getGroupMembers', 181, 182), +(93, 84, NULL, NULL, 'edit', 183, 184), +(94, 84, NULL, NULL, 'checkIfChanged', 185, 186), +(95, 84, NULL, NULL, 'calculateFrequency', 187, 188), +(96, 84, NULL, NULL, 'delete', 189, 190), +(97, 84, NULL, NULL, 'checkDuplicateName', 191, 192), +(98, 2, NULL, NULL, 'Faculties', 194, 205), +(99, 98, NULL, NULL, 'index', 195, 196), +(100, 98, NULL, NULL, 'view', 197, 198), +(101, 98, NULL, NULL, 'add', 199, 200), +(102, 98, NULL, NULL, 'edit', 201, 202), +(103, 98, NULL, NULL, 'delete', 203, 204), +(104, 2, NULL, NULL, 'Framework', 206, 221), +(105, 104, NULL, NULL, 'calendarDisplay', 207, 208), +(106, 104, NULL, NULL, 'tutIndex', 209, 210), +(107, 104, NULL, NULL, 'add', 211, 212), +(108, 104, NULL, NULL, 'edit', 213, 214), +(109, 104, NULL, NULL, 'index', 215, 216), +(110, 104, NULL, NULL, 'view', 217, 218), +(111, 104, NULL, NULL, 'delete', 219, 220), +(112, 2, NULL, NULL, 'Groups', 222, 241), +(113, 112, NULL, NULL, 'setUpAjaxList', 223, 224), +(114, 112, NULL, NULL, 'index', 225, 226), +(115, 112, NULL, NULL, 'ajaxList', 227, 228), +(116, 112, NULL, NULL, 'view', 229, 230), +(117, 112, NULL, NULL, 'add', 231, 232), +(118, 112, NULL, NULL, 'edit', 233, 234), +(119, 112, NULL, NULL, 'delete', 235, 236), +(120, 112, NULL, NULL, 'import', 237, 238), +(121, 112, NULL, NULL, 'export', 239, 240), +(122, 2, NULL, NULL, 'Home', 242, 253), +(123, 122, NULL, NULL, 'index', 243, 244), +(124, 122, NULL, NULL, 'add', 245, 246), +(125, 122, NULL, NULL, 'edit', 247, 248), +(126, 122, NULL, NULL, 'view', 249, 250), +(127, 122, NULL, NULL, 'delete', 251, 252), +(128, 2, NULL, NULL, 'Install', 254, 275), +(129, 128, NULL, NULL, 'index', 255, 256), +(130, 128, NULL, NULL, 'install2', 257, 258), +(131, 128, NULL, NULL, 'install3', 259, 260), +(132, 128, NULL, NULL, 'install4', 261, 262), +(133, 128, NULL, NULL, 'install5', 263, 264), +(134, 128, NULL, NULL, 'gpl', 265, 266), +(135, 128, NULL, NULL, 'add', 267, 268), +(136, 128, NULL, NULL, 'edit', 269, 270), +(137, 128, NULL, NULL, 'view', 271, 272), +(138, 128, NULL, NULL, 'delete', 273, 274), +(139, 2, NULL, NULL, 'Lti', 276, 287), +(140, 139, NULL, NULL, 'index', 277, 278), +(141, 139, NULL, NULL, 'add', 279, 280), +(142, 139, NULL, NULL, 'edit', 281, 282), +(143, 139, NULL, NULL, 'view', 283, 284), +(144, 139, NULL, NULL, 'delete', 285, 286), +(145, 2, NULL, NULL, 'Mixevals', 288, 305), +(146, 145, NULL, NULL, 'setUpAjaxList', 289, 290), +(147, 145, NULL, NULL, 'index', 291, 292), +(148, 145, NULL, NULL, 'ajaxList', 293, 294), +(149, 145, NULL, NULL, 'view', 295, 296), +(150, 145, NULL, NULL, 'add', 297, 298), +(151, 145, NULL, NULL, 'edit', 299, 300), +(152, 145, NULL, NULL, 'copy', 301, 302), +(153, 145, NULL, NULL, 'delete', 303, 304), +(154, 2, NULL, NULL, 'Oauthclients', 306, 317), +(155, 154, NULL, NULL, 'index', 307, 308), +(156, 154, NULL, NULL, 'add', 309, 310), +(157, 154, NULL, NULL, 'edit', 311, 312), +(158, 154, NULL, NULL, 'delete', 313, 314), +(159, 154, NULL, NULL, 'view', 315, 316), +(160, 2, NULL, NULL, 'Oauthtokens', 318, 329), +(161, 160, NULL, NULL, 'index', 319, 320), +(162, 160, NULL, NULL, 'add', 321, 322), +(163, 160, NULL, NULL, 'edit', 323, 324), +(164, 160, NULL, NULL, 'delete', 325, 326), +(165, 160, NULL, NULL, 'view', 327, 328), +(166, 2, NULL, NULL, 'Penalty', 330, 343), +(167, 166, NULL, NULL, 'save', 331, 332), +(168, 166, NULL, NULL, 'add', 333, 334), +(169, 166, NULL, NULL, 'edit', 335, 336), +(170, 166, NULL, NULL, 'index', 337, 338), +(171, 166, NULL, NULL, 'view', 339, 340), +(172, 166, NULL, NULL, 'delete', 341, 342), +(173, 2, NULL, NULL, 'Rubrics', 344, 363), +(174, 173, NULL, NULL, 'postProcess', 345, 346), +(175, 173, NULL, NULL, 'setUpAjaxList', 347, 348), +(176, 173, NULL, NULL, 'index', 349, 350), +(177, 173, NULL, NULL, 'ajaxList', 351, 352), +(178, 173, NULL, NULL, 'view', 353, 354), +(179, 173, NULL, NULL, 'add', 355, 356), +(180, 173, NULL, NULL, 'edit', 357, 358), +(181, 173, NULL, NULL, 'copy', 359, 360), +(182, 173, NULL, NULL, 'delete', 361, 362), +(183, 2, NULL, NULL, 'Searchs', 364, 391), +(184, 183, NULL, NULL, 'update', 365, 366), +(185, 183, NULL, NULL, 'index', 367, 368), +(186, 183, NULL, NULL, 'searchEvaluation', 369, 370), +(187, 183, NULL, NULL, 'searchResult', 371, 372), +(188, 183, NULL, NULL, 'searchInstructor', 373, 374), +(189, 183, NULL, NULL, 'eventBoxSearch', 375, 376), +(190, 183, NULL, NULL, 'formatSearchEvaluation', 377, 378), +(191, 183, NULL, NULL, 'formatSearchInstructor', 379, 380), +(192, 183, NULL, NULL, 'formatSearchEvaluationResult', 381, 382), +(193, 183, NULL, NULL, 'add', 383, 384), +(194, 183, NULL, NULL, 'edit', 385, 386), +(195, 183, NULL, NULL, 'view', 387, 388), +(196, 183, NULL, NULL, 'delete', 389, 390), +(197, 2, NULL, NULL, 'Simpleevaluations', 392, 411), +(198, 197, NULL, NULL, 'postProcess', 393, 394), +(199, 197, NULL, NULL, 'setUpAjaxList', 395, 396), +(200, 197, NULL, NULL, 'index', 397, 398), +(201, 197, NULL, NULL, 'ajaxList', 399, 400), +(202, 197, NULL, NULL, 'view', 401, 402), +(203, 197, NULL, NULL, 'add', 403, 404), +(204, 197, NULL, NULL, 'edit', 405, 406), +(205, 197, NULL, NULL, 'copy', 407, 408), +(206, 197, NULL, NULL, 'delete', 409, 410), +(207, 2, NULL, NULL, 'Surveygroups', 412, 443), +(208, 207, NULL, NULL, 'postProcess', 413, 414), +(209, 207, NULL, NULL, 'setUpAjaxList', 415, 416), +(210, 207, NULL, NULL, 'index', 417, 418), +(211, 207, NULL, NULL, 'ajaxList', 419, 420), +(212, 207, NULL, NULL, 'makegroups', 421, 422), +(213, 207, NULL, NULL, 'makegroupssearch', 423, 424), +(214, 207, NULL, NULL, 'maketmgroups', 425, 426), +(215, 207, NULL, NULL, 'savegroups', 427, 428), +(216, 207, NULL, NULL, 'release', 429, 430), +(217, 207, NULL, NULL, 'delete', 431, 432), +(218, 207, NULL, NULL, 'edit', 433, 434), +(219, 207, NULL, NULL, 'changegroupset', 435, 436), +(220, 207, NULL, NULL, 'export', 437, 438), +(221, 207, NULL, NULL, 'add', 439, 440), +(222, 207, NULL, NULL, 'view', 441, 442), +(223, 2, NULL, NULL, 'Surveys', 444, 473), +(224, 223, NULL, NULL, 'setUpAjaxList', 445, 446), +(225, 223, NULL, NULL, 'index', 447, 448), +(226, 223, NULL, NULL, 'ajaxList', 449, 450), +(227, 223, NULL, NULL, 'view', 451, 452), +(228, 223, NULL, NULL, 'add', 453, 454), +(229, 223, NULL, NULL, 'edit', 455, 456), +(230, 223, NULL, NULL, 'copy', 457, 458), +(231, 223, NULL, NULL, 'delete', 459, 460), +(232, 223, NULL, NULL, 'questionsSummary', 461, 462), +(233, 223, NULL, NULL, 'moveQuestion', 463, 464), +(234, 223, NULL, NULL, 'removeQuestion', 465, 466), +(235, 223, NULL, NULL, 'addQuestion', 467, 468), +(236, 223, NULL, NULL, 'editQuestion', 469, 470), +(237, 223, NULL, NULL, 'surveyAccess', 471, 472), +(238, 2, NULL, NULL, 'Sysparameters', 474, 489), +(239, 238, NULL, NULL, 'setUpAjaxList', 475, 476), +(240, 238, NULL, NULL, 'index', 477, 478), +(241, 238, NULL, NULL, 'ajaxList', 479, 480), +(242, 238, NULL, NULL, 'view', 481, 482), +(243, 238, NULL, NULL, 'add', 483, 484), +(244, 238, NULL, NULL, 'edit', 485, 486), +(245, 238, NULL, NULL, 'delete', 487, 488), +(246, 2, NULL, NULL, 'Upgrade', 490, 503), +(247, 246, NULL, NULL, 'index', 491, 492), +(248, 246, NULL, NULL, 'step2', 493, 494), +(249, 246, NULL, NULL, 'add', 495, 496), +(250, 246, NULL, NULL, 'edit', 497, 498), +(251, 246, NULL, NULL, 'view', 499, 500), +(252, 246, NULL, NULL, 'delete', 501, 502), +(253, 2, NULL, NULL, 'Users', 504, 541), +(254, 253, NULL, NULL, 'ajaxList', 505, 506), +(255, 253, NULL, NULL, 'index', 507, 508), +(256, 253, NULL, NULL, 'goToClassList', 509, 510), +(257, 253, NULL, NULL, 'determineIfStudentFromThisData', 511, 512), +(258, 253, NULL, NULL, 'view', 513, 514), +(259, 253, NULL, NULL, 'add', 515, 516), +(260, 253, NULL, NULL, 'enrol', 517, 518), +(261, 253, NULL, NULL, 'edit', 519, 520), +(262, 253, NULL, NULL, 'editProfile', 521, 522), +(263, 253, NULL, NULL, 'delete', 523, 524), +(264, 253, NULL, NULL, 'checkDuplicateName', 525, 526), +(265, 253, NULL, NULL, 'resetPassword', 527, 528), +(266, 253, NULL, NULL, 'resetPasswordWithoutEmail', 529, 530), +(267, 253, NULL, NULL, 'import', 531, 532), +(268, 253, NULL, NULL, 'merge', 533, 534), +(269, 253, NULL, NULL, 'ajax_merge', 535, 536), +(270, 253, NULL, NULL, 'update', 537, 538), +(271, 253, NULL, NULL, 'showEvents', 539, 540), +(272, 2, NULL, NULL, 'V1', 542, 577), +(273, 272, NULL, NULL, 'oauth', 543, 544), +(274, 272, NULL, NULL, 'oauth_error', 545, 546), +(275, 272, NULL, NULL, 'users', 547, 548), +(276, 272, NULL, NULL, 'courses', 549, 550), +(277, 272, NULL, NULL, 'groups', 551, 552), +(278, 272, NULL, NULL, 'groupMembers', 553, 554), +(279, 272, NULL, NULL, 'events', 555, 556), +(280, 272, NULL, NULL, 'grades', 557, 558), +(281, 272, NULL, NULL, 'departments', 559, 560), +(282, 272, NULL, NULL, 'courseDepartments', 561, 562), +(283, 272, NULL, NULL, 'userEvents', 563, 564), +(284, 272, NULL, NULL, 'enrolment', 565, 566), +(285, 272, NULL, NULL, 'add', 567, 568), +(286, 272, NULL, NULL, 'edit', 569, 570), +(287, 272, NULL, NULL, 'index', 571, 572), +(288, 272, NULL, NULL, 'view', 573, 574), +(289, 272, NULL, NULL, 'delete', 575, 576), +(290, 2, NULL, NULL, 'Guard', 578, 595), +(291, 290, NULL, NULL, 'Guard', 579, 594), +(292, 291, NULL, NULL, 'login', 580, 581), +(293, 291, NULL, NULL, 'logout', 582, 583), +(294, 291, NULL, NULL, 'add', 584, 585), +(295, 291, NULL, NULL, 'edit', 586, 587), +(296, 291, NULL, NULL, 'index', 588, 589), +(297, 291, NULL, NULL, 'view', 590, 591), +(298, 291, NULL, NULL, 'delete', 592, 593), +(299, NULL, NULL, NULL, 'functions', 597, 662), +(300, 299, NULL, NULL, 'user', 598, 625), +(301, 300, NULL, NULL, 'superadmin', 599, 600), +(302, 300, NULL, NULL, 'admin', 601, 602), +(303, 300, NULL, NULL, 'instructor', 603, 604), +(304, 300, NULL, NULL, 'tutor', 605, 606), +(305, 300, NULL, NULL, 'student', 607, 608), +(306, 300, NULL, NULL, 'import', 609, 610), +(307, 300, NULL, NULL, 'password_reset', 611, 622), +(308, 307, NULL, NULL, 'superadmin', 612, 613), +(309, 307, NULL, NULL, 'admin', 614, 615), +(310, 307, NULL, NULL, 'instructor', 616, 617), +(311, 307, NULL, NULL, 'tutor', 618, 619), +(312, 307, NULL, NULL, 'student', 620, 621), +(313, 300, NULL, NULL, 'index', 623, 624), +(314, 299, NULL, NULL, 'role', 626, 637), +(315, 314, NULL, NULL, 'superadmin', 627, 628), +(316, 314, NULL, NULL, 'admin', 629, 630), +(317, 314, NULL, NULL, 'instructor', 631, 632), +(318, 314, NULL, NULL, 'tutor', 633, 634), +(319, 314, NULL, NULL, 'student', 635, 636), +(320, 299, NULL, NULL, 'evaluation', 638, 639), +(321, 299, NULL, NULL, 'email', 640, 647), +(322, 321, NULL, NULL, 'allUsers', 641, 642), +(323, 321, NULL, NULL, 'allGroups', 643, 644), +(324, 321, NULL, NULL, 'allCourses', 645, 646), +(325, 299, NULL, NULL, 'emailtemplate', 648, 649), +(326, 299, NULL, NULL, 'viewstudentresults', 650, 651), +(327, 299, NULL, NULL, 'viewemailaddresses', 652, 653), +(328, 299, NULL, NULL, 'superadmin', 654, 655), +(329, 299, NULL, NULL, 'coursemanager', 656, 657), +(330, 299, NULL, NULL, 'viewusername', 658, 659), +(331, 299, NULL, NULL, 'submitstudenteval', 660, 661); -- -------------------------------------------------------- @@ -427,123 +429,127 @@ SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; INSERT INTO aros_acos (id, aro_id, aco_id, _create, _read, _update, _delete) VALUES -(1,1,2,'1','1','1','1'), -(2,1,298,'1','1','1','1'), -(3,1,1,'1','1','1','1'), -(4,2,2,'-1','-1','-1','-1'), -(5,2,56,'1','1','1','1'), -(6,2,242,'1','1','1','1'), -(7,2,198,'1','1','1','1'), -(8,2,201,'-1','-1','-1','-1'), -(9,2,200,'-1','-1','-1','-1'), -(10,2,203,'-1','-1','-1','-1'), -(11,2,202,'-1','-1','-1','-1'), -(12,2,199,'-1','-1','-1','-1'), -(13,2,275,'1','1','1','1'), -(14,2,221,'1','1','1','1'), -(15,2,117,'1','1','1','1'), -(16,2,91,'1','1','1','1'), -(17,2,156,'1','1','1','1'), -(18,2,130,'1','1','1','1'), -(19,2,212,'1','1','1','1'), -(20,2,146,'1','1','1','1'), -(21,2,170,'1','1','1','1'), -(22,2,254,'1','1','1','1'), -(23,2,68,'1','1','1','1'), -(24,2,24,'1','1','1','1'), -(25,2,292,'1','1','1','1'), -(26,2,298,'-1','-1','-1','-1'), -(27,2,324,'1','1','1','1'), -(28,2,319,'1','1','1','1'), -(29,2,321,'1','1','1','1'), -(30,2,299,'1','1','1','1'), -(31,2,301,'1','1','1','-1'), -(32,2,300,'-1','-1','-1','-1'), -(33,2,326,'1','1','1','1'), -(34,2,329,'1','1','1','1'), -(35,2,328,'1','1','1','1'), -(36,2,327,'-1','-1','-1','-1'), -(37,3,2,'-1','-1','-1','-1'), -(38,3,56,'1','1','1','1'), -(39,3,242,'1','1','1','1'), -(40,3,275,'1','1','1','1'), -(41,3,221,'1','1','1','1'), -(42,3,117,'1','1','1','1'), -(43,3,91,'1','1','1','1'), -(44,3,156,'1','1','1','1'), -(45,3,130,'1','1','1','1'), -(46,3,212,'1','1','1','1'), -(47,3,146,'1','1','1','1'), -(48,3,170,'1','1','1','1'), -(49,3,254,'1','1','1','1'), -(50,3,68,'1','1','1','1'), -(51,3,24,'1','1','1','1'), -(52,3,292,'1','1','1','1'), -(53,3,44,'1','1','1','1'), -(54,3,46,'1','1','1','1'), -(55,3,113,'1','1','1','1'), -(56,3,115,'1','1','1','1'), -(57,3,38,'-1','-1','-1','-1'), -(58,3,41,'1','1','1','1'), -(59,3,298,'-1','-1','-1','-1'), -(60,3,319,'1','1','-1','-1'), -(61,3,299,'1','1','1','1'), -(62,3,301,'-1','-1','-1','-1'), -(63,3,300,'-1','-1','-1','-1'), -(64,3,302,'-1','1','-1','-1'), -(65,3,312,'-1','-1','-1','-1'), -(66,3,326,'-1','-1','-1','-1'), -(67,3,327,'-1','-1','-1','-1'), -(68,3,328,'1','1','1','1'), -(69,4,2,'-1','-1','-1','-1'), -(70,4,56,'1','1','1','1'), -(71,4,242,'-1','-1','-1','-1'), -(72,4,275,'-1','-1','-1','-1'), -(73,4,221,'-1','-1','-1','-1'), -(74,4,117,'-1','-1','-1','-1'), -(75,4,156,'-1','-1','-1','-1'), -(76,4,130,'-1','-1','-1','-1'), -(77,4,212,'-1','-1','-1','-1'), -(78,4,146,'-1','-1','-1','-1'), -(79,4,170,'-1','-1','-1','-1'), -(80,4,254,'-1','-1','-1','-1'), -(81,4,68,'-1','-1','-1','-1'), -(82,4,24,'-1','-1','-1','-1'), -(83,4,292,'1','1','1','1'), -(84,4,97,'1','1','1','1'), -(85,4,100,'1','1','1','1'), -(86,4,98,'1','1','1','1'), -(87,4,33,'1','1','1','1'), -(88,4,298,'-1','-1','-1','-1'), -(89,4,326,'-1','-1','-1','-1'), -(90,4,327,'-1','-1','-1','-1'), -(91,5,2,'-1','-1','-1','-1'), -(92,5,56,'1','1','1','1'), -(93,5,242,'-1','-1','-1','-1'), -(94,5,275,'-1','-1','-1','-1'), -(95,5,221,'-1','-1','-1','-1'), -(96,5,117,'-1','-1','-1','-1'), -(97,5,156,'-1','-1','-1','-1'), -(98,5,130,'-1','-1','-1','-1'), -(99,5,212,'-1','-1','-1','-1'), -(100,5,146,'-1','-1','-1','-1'), -(101,5,170,'-1','-1','-1','-1'), -(102,5,254,'-1','-1','-1','-1'), -(103,5,68,'-1','-1','-1','-1'), -(104,5,24,'-1','-1','-1','-1'), -(105,5,292,'1','1','1','1'), -(106,5,97,'1','1','1','1'), -(107,5,100,'1','1','1','1'), -(108,5,98,'1','1','1','1'), -(109,5,33,'1','1','1','1'), -(110,5,44,'1','1','1','1'), -(111,5,46,'1','1','1','1'), -(112,5,113,'1','1','1','1'), -(113,5,115,'1','1','1','1'), -(114,5,298,'-1','-1','-1','-1'), -(115,5,325,'1','1','1','1'), -(116,5,326,'-1','-1','-1','-1'), -(117,5,327,'-1','-1','-1','-1'); +(1, 1, 2, '1', '1', '1', '1'), +(2, 1, 299, '1', '1', '1', '1'), +(3, 1, 1, '1', '1', '1', '1'), +(4, 2, 2, '-1', '-1', '-1', '-1'), +(5, 2, 122, '1', '1', '1', '1'), +(6, 2, 16, '1', '1', '1', '1'), +(7, 2, 28, '1', '1', '1', '1'), +(8, 2, 31, '-1', '-1', '-1', '-1'), +(9, 2, 30, '-1', '-1', '-1', '-1'), +(10, 2, 33, '-1', '-1', '-1', '-1'), +(11, 2, 32, '-1', '-1', '-1', '-1'), +(12, 2, 29, '-1', '-1', '-1', '-1'), +(13, 2, 34, '1', '1', '1', '1'), +(14, 2, 48, '1', '1', '1', '1'), +(15, 2, 58, '1', '1', '1', '1'), +(16, 2, 64, '1', '1', '1', '1'), +(17, 2, 84, '1', '1', '1', '1'), +(18, 2, 112, '1', '1', '1', '1'), +(19, 2, 145, '1', '1', '1', '1'), +(20, 2, 173, '1', '1', '1', '1'), +(21, 2, 197, '1', '1', '1', '1'), +(22, 2, 223, '1', '1', '1', '1'), +(23, 2, 207, '1', '1', '1', '1'), +(24, 2, 253, '1', '1', '1', '1'), +(25, 2, 266, '-1', '-1', '-1', '-1'), +(26, 2, 293, '1', '1', '1', '1'), +(27, 2, 299, '-1', '-1', '-1', '-1'), +(28, 2, 325, '1', '1', '1', '1'), +(29, 2, 320, '1', '1', '1', '1'), +(30, 2, 322, '1', '1', '1', '1'), +(31, 2, 300, '1', '1', '1', '1'), +(32, 2, 302, '1', '1', '1', '-1'), +(33, 2, 301, '-1', '-1', '-1', '-1'), +(34, 2, 327, '1', '1', '1', '1'), +(35, 2, 330, '1', '1', '1', '1'), +(36, 2, 329, '1', '1', '1', '1'), +(37, 2, 328, '-1', '-1', '-1', '-1'), +(38, 2, 331, '1', '1', '1', '1'), +(39, 3, 2, '-1', '-1', '-1', '-1'), +(40, 3, 122, '1', '1', '1', '1'), +(41, 3, 16, '1', '1', '1', '1'), +(42, 3, 34, '1', '1', '1', '1'), +(43, 3, 48, '1', '1', '1', '1'), +(44, 3, 58, '1', '1', '1', '1'), +(45, 3, 64, '1', '1', '1', '1'), +(46, 3, 84, '1', '1', '1', '1'), +(47, 3, 112, '1', '1', '1', '1'), +(48, 3, 145, '1', '1', '1', '1'), +(49, 3, 173, '1', '1', '1', '1'), +(50, 3, 197, '1', '1', '1', '1'), +(51, 3, 223, '1', '1', '1', '1'), +(52, 3, 207, '1', '1', '1', '1'), +(53, 3, 253, '1', '1', '1', '1'), +(54, 3, 293, '1', '1', '1', '1'), +(55, 3, 156, '1', '1', '1', '1'), +(56, 3, 158, '1', '1', '1', '1'), +(57, 3, 162, '1', '1', '1', '1'), +(58, 3, 164, '1', '1', '1', '1'), +(59, 3, 268, '-1', '-1', '-1', '-1'), +(60, 3, 271, '1', '1', '1', '1'), +(61, 3, 266, '-1', '-1', '-1', '-1'), +(62, 3, 299, '-1', '-1', '-1', '-1'), +(63, 3, 320, '1', '1', '-1', '-1'), +(64, 3, 300, '1', '1', '1', '1'), +(65, 3, 302, '-1', '-1', '-1', '-1'), +(66, 3, 301, '-1', '-1', '-1', '-1'), +(67, 3, 303, '-1', '1', '-1', '-1'), +(68, 3, 313, '-1', '-1', '-1', '-1'), +(69, 3, 327, '-1', '-1', '-1', '-1'), +(70, 3, 328, '-1', '-1', '-1', '-1'), +(71, 3, 329, '1', '1', '1', '1'), +(72, 3, 331, '-1', '-1', '-1', '-1'), +(73, 4, 2, '-1', '-1', '-1', '-1'), +(74, 4, 122, '1', '1', '1', '1'), +(75, 4, 16, '-1', '-1', '-1', '-1'), +(76, 4, 34, '-1', '-1', '-1', '-1'), +(77, 4, 48, '-1', '-1', '-1', '-1'), +(78, 4, 58, '-1', '-1', '-1', '-1'), +(79, 4, 84, '-1', '-1', '-1', '-1'), +(80, 4, 112, '-1', '-1', '-1', '-1'), +(81, 4, 145, '-1', '-1', '-1', '-1'), +(82, 4, 173, '-1', '-1', '-1', '-1'), +(83, 4, 197, '-1', '-1', '-1', '-1'), +(84, 4, 223, '-1', '-1', '-1', '-1'), +(85, 4, 207, '-1', '-1', '-1', '-1'), +(86, 4, 253, '-1', '-1', '-1', '-1'), +(87, 4, 293, '1', '1', '1', '1'), +(88, 4, 70, '1', '1', '1', '1'), +(89, 4, 73, '1', '1', '1', '1'), +(90, 4, 71, '1', '1', '1', '1'), +(91, 4, 262, '1', '1', '1', '1'), +(92, 4, 299, '-1', '-1', '-1', '-1'), +(93, 4, 327, '-1', '-1', '-1', '-1'), +(94, 4, 328, '-1', '-1', '-1', '-1'), +(95, 5, 2, '-1', '-1', '-1', '-1'), +(96, 5, 122, '1', '1', '1', '1'), +(97, 5, 16, '-1', '-1', '-1', '-1'), +(98, 5, 34, '-1', '-1', '-1', '-1'), +(99, 5, 48, '-1', '-1', '-1', '-1'), +(100, 5, 58, '-1', '-1', '-1', '-1'), +(101, 5, 84, '-1', '-1', '-1', '-1'), +(102, 5, 112, '-1', '-1', '-1', '-1'), +(103, 5, 145, '-1', '-1', '-1', '-1'), +(104, 5, 173, '-1', '-1', '-1', '-1'), +(105, 5, 197, '-1', '-1', '-1', '-1'), +(106, 5, 223, '-1', '-1', '-1', '-1'), +(107, 5, 207, '-1', '-1', '-1', '-1'), +(108, 5, 253, '-1', '-1', '-1', '-1'), +(109, 5, 293, '1', '1', '1', '1'), +(110, 5, 70, '1', '1', '1', '1'), +(111, 5, 73, '1', '1', '1', '1'), +(112, 5, 71, '1', '1', '1', '1'), +(113, 5, 262, '1', '1', '1', '1'), +(114, 5, 156, '1', '1', '1', '1'), +(115, 5, 158, '1', '1', '1', '1'), +(116, 5, 162, '1', '1', '1', '1'), +(117, 5, 164, '1', '1', '1', '1'), +(118, 5, 299, '-1', '-1', '-1', '-1'), +(119, 5, 326, '1', '1', '1', '1'), +(120, 5, 327, '-1', '-1', '-1', '-1'), +(121, 5, 328, '-1', '-1', '-1', '-1'); -- -------------------------------------------------------- diff --git a/app/controllers/users_controller.php b/app/controllers/users_controller.php index 58b69540a..ffde8352c 100644 --- a/app/controllers/users_controller.php +++ b/app/controllers/users_controller.php @@ -115,7 +115,8 @@ function _setUpAjaxList () // define action warnings $deleteUserWarning = __("Delete this user. Irreversible. Are you sure?", true); - $resetPassWarning = __("Resets user Password. Are you sure?", true); + $resetPassWarning = __("Resets user's password. Are you sure?", true); + $resetPassWOEmail = __("Resets user's password without sending a email. The user will lose access to the system. Are you sure?", true); $actionRestrictions = ""; @@ -165,6 +166,11 @@ function _setUpAjaxList () array(__("Delete User", true), $deleteUserWarning, $actionRestrictions, "", "delete", "User.id"), array(__("Reset Password", true), $resetPassWarning, $actionRestrictions, "", "resetPassword", "User.id") ); + + // add the functionality of resetting a user's password without sending the user a email + if(User::hasPermission('controllers/users/resetpasswordwithoutemail')) { + $actions[] = array(__("Reset Password Without Email", true), $resetPassWOEmail, "", "", "resetPasswordWithoutEmail", "User.id"); + } $this->AjaxList->setUp($this->User, $columns, $actions, "User.id", "User.username", $joinTables, $extraFilters); @@ -210,6 +216,8 @@ function index($message='') $this->Session->setFlash('You do not have permission to view users.'); $this->redirect('/home'); } + + $this->_checkResetPasswordPermission(1,1); // Set the top message $this->set('message', $message); @@ -937,74 +945,21 @@ function checkDuplicateName($courseId = null) /** * resetPassword * - * @param mixed $user_id user id + * @param mixed $userId user id * @param mixed $courseId course id * * @access public * @return void */ - function resetPassword($user_id, $courseId = null) + function resetPassword($userId, $courseId = null) { - $role = $this->User->getRoleName($user_id); - - if (!User::hasPermission('functions/user')) { - $this->Session->setFlash('Error: You do not have permission to reset passwords', true); - $this->redirect('/home'); - } - - if (!User::hasPermission('functions/user/'.$role)) { - $this->Session->setFlash('Error: You do not have permission to reset the password for this user.', true); - if (is_null($courseId)) { - $this->redirect('index'); - } else { - $this->redirect('/users/goToClassList/'.$courseId); - } - } - - // Read the user - $user_data = $this->User->findById($user_id); - - if (empty($user_data)) { - $this->Session->setFlash(__('User Not Found!', true)); - $this->redirect("index"); - } - - // super admins and faculty admins can reset passwords for all users - // instructors can only reset passwords for students and tutors in their course(s) - if (!User::hasPermission('controllers/departments')) { - // instructors - $courses = User::getMyCourseList(); - $models = array('UserTutor', 'UserEnrol'); - $accessibleUsers = array(); - - foreach ($models as $model) { - $users = $this->$model->find('list', array( - 'conditions' => array('course_id' => array_keys($courses)), - 'fields' => array('user_id') - )); - $accessibleUsers = array_merge($accessibleUsers, $users); - } - - if (!in_array($user_id, $accessibleUsers)) { - $this->Session->setFlash(__('Error: You do not have permission to reset the password for this user', true)); - if (is_null($courseId)) { - $this->redirect('index'); - } else { - $this->redirect('/users/goToClassList/'.$courseId); - } - } - } - - //General password - $tmp_password = $this->PasswordGenerator->generate(); - $user_data['User']['tmp_password'] = $tmp_password; - $user_data['User']['password'] = md5($tmp_password); - $user_data['User']['id'] = $user_id; + // checks the user's permissions + $userData = $this->_checkResetPasswordPermission($userId, $courseId); //Save Data - if ($this->User->save($user_data, true, array('password'))) { + if ($tmp_password = $this->User->savePassword($userId)) { $message = sprintf(__("Password successfully reset. The new password is %s.", true).'
    ', $tmp_password); - $this->User->set('id', $user_id); + $this->User->set('id', $userId); // send email to user $this->set('user_data', $user_data); @@ -1024,6 +979,30 @@ function resetPassword($user_id, $courseId = null) $this->redirect($this->referer()); } } + + /** + * resetPasswordWithoutEmail + * + * @param mixed $userId + * @param mixed $courseId + * + * @return boolean: true for success and false for fail + */ + public function resetPasswordWithoutEmail($userId, $courseId = null) + { + // checks the user's permissions + $this->_checkResetPasswordPermission($userId, $courseId); + + // generate and save new password + if ($tmp_password = $this->User->savePassword($userId)) { + $message = sprintf(__("Password successfully reset. The new password is %s.", true).'
    ', $tmp_password); + $this->Session->setFlash($message, 'good'); + $this->redirect($this->referer()); + } else { + //Get render page according to the user type + $this->redirect($this->referer()); + } + } /** * import @@ -1275,6 +1254,67 @@ function __setSessionData($userData) $this->Session->write('ipeerSession.email', $userData['email']); } + /** + * _checkResetPasswordPermission + * + * @param mixed $userId + * @param mixed $courseId + * + * @access private + * @return array of user data + */ + private function _checkResetPasswordPermission($userId, $courseId) + { + if (!User::hasPermission('functions/user')) { + $this->Session->setFlash('Error: You do not have permission to reset passwords', true); + $this->redirect('/home'); + } + + // Read the user + $userData = $this->User->findById($userId); + if (empty($userData)) { + $this->Session->setFlash(__('User Not Found!', true)); + $this->redirect("index"); + } + + $role = $this->User->getRoleName($userId); + if (!User::hasPermission('functions/user/'.$role)) { + $this->Session->setFlash('Error: You do not have permission to reset the password for this user.', true); + if (is_null($courseId)) { + $this->redirect('index'); + } else { + $this->redirect('/users/goToClassList/'.$courseId); + } + } + + // super admins and faculty admins can reset passwords for all users + // instructors can only reset passwords for students and tutors in their course(s) + if (!User::hasPermission('controllers/departments')) { + // instructors + $courses = User::getMyCourseList(); + $models = array('UserTutor', 'UserEnrol'); + $accessibleUsers = array(); + + foreach ($models as $model) { + $users = $this->$model->find('list', array( + 'conditions' => array('course_id' => array_keys($courses)), + 'fields' => array('user_id') + )); + $accessibleUsers = array_merge($accessibleUsers, $users); + } + + if (!in_array($userId, $accessibleUsers)) { + $this->Session->setFlash(__('Error: You do not have permission to reset the password for this user', true)); + if (is_null($courseId)) { + $this->redirect('index'); + } else { + $this->redirect('/users/goToClassList/'.$courseId); + } + } + } + + return $userData; + } /** * Helper function to send an email notification about to a user about diff --git a/app/models/user.php b/app/models/user.php index 9abe71887..d3a80e240 100644 --- a/app/models/user.php +++ b/app/models/user.php @@ -1076,6 +1076,28 @@ function getInstructorCourses($userId='') )); return Set::extract($user, '/Course/id'); } + + /** + * generates and saves new password + * + * @param mixed $user_id + * + * @return boolean + */ + function savePassword($user_id) { + App::import('Component', 'PasswordGenerator'); + $psGen = new PasswordGeneratorComponent(); + + $tmp_password = $psGen->generate(); + $user_data['User']['tmp_password'] = $tmp_password; + $user_data['User']['password'] = md5($tmp_password); + $user_data['User']['id'] = $user_id; + + if($this->save($user_data, true, array('password'))) { + return $tmp_password; + } + return false; + } /********************************* * Static functions diff --git a/app/vendors/shells/create_acl.php b/app/vendors/shells/create_acl.php index e52564c66..50429460d 100644 --- a/app/vendors/shells/create_acl.php +++ b/app/vendors/shells/create_acl.php @@ -498,6 +498,7 @@ function createPermissions() $this->Acl->allow($role, 'controllers/Surveys'); $this->Acl->allow($role, 'controllers/Surveygroups'); $this->Acl->allow($role, 'controllers/Users'); + $this->Acl->deny($role, 'controllers/Users/resetPasswordWithoutEmail'); $this->Acl->allow($role, 'controllers/Evaluations'); $this->Acl->allow($role, 'controllers/guard/guard/logout'); $this->Acl->deny($role, 'functions'); @@ -537,6 +538,7 @@ function createPermissions() $this->Acl->allow($role, 'controllers/Oauthtokens/delete'); $this->Acl->deny($role, 'controllers/Users/merge'); $this->Acl->allow($role, 'controllers/Users/showEvents'); + $this->Acl->deny($role, 'controllers/Users/resetPasswordWithoutEmail'); $this->Acl->deny($role, 'functions'); $this->Acl->allow($role, 'functions/evaluation'); $this->Acl->deny($role, 'functions/evaluation', 'update'); diff --git a/app/views/users/go_to_class_list.ctp b/app/views/users/go_to_class_list.ctp index ee5248860..0dcce0bbc 100644 --- a/app/views/users/go_to_class_list.ctp +++ b/app/views/users/go_to_class_list.ctp @@ -60,18 +60,23 @@ function fnFormatDetails ( oTable, nTr ) sOut += '
    Reset Password'; sOut += '
    '; + + sOut += ''; + sOut += '
    Reset Password Without Email'; + sOut += '
    '; + + sOut += ''; sOut += '
    Drop'; sOut += '
    '; + sOut += ''; sOut += '
    Show user\'s events'; sOut += '
    '; - - + return sOut; } From 5a15b3598f6ef523191bd6b5898db4308854bfd8 Mon Sep 17 00:00:00 2001 From: Compass Date: Fri, 7 Mar 2014 15:36:43 -0800 Subject: [PATCH 63/91] Update puppet modules and fix the permission issue --- .gitmodules | 3 +++ puppet/bootstrap.sh | 9 +++++---- puppet/dev.pp | 2 ++ puppet/modules/epel | 1 + puppet/modules/ipeer | 2 +- puppet/modules/mysql | 2 +- puppet/modules/nginx | 2 +- 7 files changed, 14 insertions(+), 7 deletions(-) create mode 160000 puppet/modules/epel diff --git a/.gitmodules b/.gitmodules index 3e97851be..c6e2432d8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -43,3 +43,6 @@ [submodule "vendors/sausage"] path = vendors/sausage url = https://github.com/jlipps/sausage.git +[submodule "puppet/modules/epel"] + path = puppet/modules/epel + url = https://github.com/stahnma/puppet-module-epel.git diff --git a/puppet/bootstrap.sh b/puppet/bootstrap.sh index 6467418d9..28e190e6a 100755 --- a/puppet/bootstrap.sh +++ b/puppet/bootstrap.sh @@ -2,12 +2,13 @@ mysql -u ipeer -pipeer -h `hostname` ipeer < /var/www/app/config/sql/ipeer_samples_data.sql # install oauth php extension required for tests -yum -y install php-devel -yum -y install pcre-devel -pecl install oauth -echo 'extension=oauth.so' > /etc/php.d/oauth.ini +#yum -y install php-devel +#yum -y install pcre-devel +#pecl install oauth +#echo 'extension=oauth.so' > /etc/php.d/oauth.ini # install phing +pear config-set auto_discover 1 pear channel-discover pear.phing.info pear install phing/phing diff --git a/puppet/dev.pp b/puppet/dev.pp index ebfbbdcf9..c3a913f19 100644 --- a/puppet/dev.pp +++ b/puppet/dev.pp @@ -1,5 +1,7 @@ +include epel include ipeer::web include ipeer::db +include ipeer::test include git ipeer::instance { ipeerdev : diff --git a/puppet/modules/epel b/puppet/modules/epel new file mode 160000 index 000000000..37333dcda --- /dev/null +++ b/puppet/modules/epel @@ -0,0 +1 @@ +Subproject commit 37333dcda9f1c4252c5e2bf38d0037192a2369c8 diff --git a/puppet/modules/ipeer b/puppet/modules/ipeer index 53885d95f..388dff30b 160000 --- a/puppet/modules/ipeer +++ b/puppet/modules/ipeer @@ -1 +1 @@ -Subproject commit 53885d95fc8a9f3262847d1604191057288b2b6a +Subproject commit 388dff30b189a96b404629b2f330d932100c9d45 diff --git a/puppet/modules/mysql b/puppet/modules/mysql index 1bc459d05..9bd108ace 160000 --- a/puppet/modules/mysql +++ b/puppet/modules/mysql @@ -1 +1 @@ -Subproject commit 1bc459d05bb43c5937fae6e65b7c77659432c76b +Subproject commit 9bd108aceeaedaa0910b3e8eed0334093f7a00c5 diff --git a/puppet/modules/nginx b/puppet/modules/nginx index 0803f4eeb..91b3940a2 160000 --- a/puppet/modules/nginx +++ b/puppet/modules/nginx @@ -1 +1 @@ -Subproject commit 0803f4eeb50e29239cc2c4533d2e1dd17d03b136 +Subproject commit 91b3940a252f587bf79ce4529153d6af6f866eb6 From aee69aad93b39521e7adf3453628e53d2f8b79e4 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 10 Mar 2014 15:32:56 -0700 Subject: [PATCH 64/91] Added instructions for using pagodabox in readme.md --- readme.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index f1aa1771f..04f4058f7 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,21 @@ +Running on PagodaBox +--------------------------- +1. Create a PagodaBox account at https://dashboard.pagodabox.com/account/register. +2. On the PagodaBox dashboard, click on "New Application". +3. Select "Clone an Existing Repo". +4. Give the application a unique name. +5. Paste the url below as your "Clone URL". + https://github.com/ubc/iPeer.git +6. Click "Launch Application". Wait for the installation to complete. +7. When you see the links "View Live App" and "Manage Your App" the installation process is complete. Click "Manage Your App". +8. Click on "View Live App" (right hand side of the dashboard). +9. Complete the iPeer installation process. Click Next. +10. Agree to the License Agreement and click Next. +11. Select Basic Installation. Click Next. +12. Create your account under "Super Admin Configuration". +13. Select your timezone (Region/City). Click Next. +14. Go to name.gopagoda.com. Login with the "Super Admin" account you have just created. + Running Virtual Development Server --------------------------- Virtual Environment Setup: @@ -44,7 +62,7 @@ Integration Tests Requirements: * Selenium Server 2.38+ * PHP Webdriver (https://github.com/Element-34/php-webdriver) -* Firfox +* Firefox Runing the tests: From 222e36a81df9be16f6eeb97cc7af82372c916a42 Mon Sep 17 00:00:00 2001 From: Compass Date: Mon, 17 Mar 2014 13:05:59 -0700 Subject: [PATCH 65/91] Update mysql puppet module --- puppet/modules/mysql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/puppet/modules/mysql b/puppet/modules/mysql index 9bd108ace..97c4d4e28 160000 --- a/puppet/modules/mysql +++ b/puppet/modules/mysql @@ -1 +1 @@ -Subproject commit 9bd108aceeaedaa0910b3e8eed0334093f7a00c5 +Subproject commit 97c4d4e28240143289c14515539b57ce554a1746 From 75a5dd9d5e4fc23a53e608df93175bc361b1d0cb Mon Sep 17 00:00:00 2001 From: Compass Date: Mon, 17 Mar 2014 13:47:01 -0700 Subject: [PATCH 66/91] Remove system test from test-ci task System test will be run as a separate Jenkins job --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 66e76c819..4b57b9f0a 100644 --- a/build.xml +++ b/build.xml @@ -229,7 +229,7 @@ - + From 07c5992f6fd9f1fb17a2c3e92be1801538a66cfe Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 17 Mar 2014 14:09:24 -0700 Subject: [PATCH 67/91] Fix #550, added ability to use email templates for event reminders Firstly, I have added four new email merges which includes course name, event title, event due date, and event close date. This allows users to create email templates that are more useful as a event reminder. The SendEmails Shell has been modified to merge the new merge keys, since the original algorithm assumes the id is a user id. Currently, only if a event id and a course id is saved with the email schedule, would the merger work. If the ids are not present, the merge keys would be ignored during the merging process. In other words, if an instructor sends out a email via iPeer (not throught event creation) and using a email template that has the event's due date key, the key will stay as {{{EVENTDUEDATE}}} in the message. In events add/edit view, the list of email templates is not visible until a frequency rate of more than zero (disable) is chosen. To be able to include the ability to edit the event reminders in events/edit, including the template used, I've saved the email template id in the email schedule's content field. When the actual subject line and content is needed in the sendEmail shell, the content would be retrieved from email_templates. --- app/config/sql/delta_7.sql | 7 ++ app/config/sql/ipeer.sql | 6 +- app/config/sql/ipeer_samples_data.sql | 6 +- app/controllers/events_controller.php | 21 +++-- app/models/email_template.php | 3 +- .../controllers/events_controller.test.php | 8 +- app/tests/cases/models/email_merge.test.php | 3 +- .../cases/models/email_template.test.php | 16 ++-- app/vendors/shells/send_emails.php | 91 ++++++++++++------- app/views/events/add.ctp | 28 ++++++ app/views/events/edit.ctp | 29 ++++++ app/webroot/css/ipeer.css | 2 +- 12 files changed, 164 insertions(+), 56 deletions(-) diff --git a/app/config/sql/delta_7.sql b/app/config/sql/delta_7.sql index 838927a07..be8c86378 100644 --- a/app/config/sql/delta_7.sql +++ b/app/config/sql/delta_7.sql @@ -514,6 +514,13 @@ ALTER TABLE mixeval_questions ADD show_marks INT(1) AFTER scale_level; ALTER TABLE rubrics_criterias ADD show_marks INT(1) AFTER multiplier; ALTER TABLE rubrics ADD view_mode VARCHAR(10) AFTER criteria; +-- Insert new email merges +INSERT INTO `email_merges` (`id`, `key`, `value`, `table_name`, `field_name`, `created`, `modified`) VALUES +(5, 'Course Name', '{{{COURSENAME}}}', 'Course', 'course', NOW(), NOW()), +(6, 'Event Title', '{{{EVENTTITLE}}}', 'Event', 'title', NOW(), NOW()), +(7, 'Event Due Date', '{{{DUEDATE}}}', 'Event', 'due_date', NOW(), NOW()), +(8, 'Event Close Date', '{{{CLOSEDATE}}}', 'Event', 'release_date_end', NOW(), NOW()); + -- Update database version, done as the very last operation as a sign that -- the update went well. UPDATE `sys_parameters` SET `parameter_value` = '7' WHERE `parameter_code` = 'database.version'; \ No newline at end of file diff --git a/app/config/sql/ipeer.sql b/app/config/sql/ipeer.sql index 665edca1b..3e1ad5644 100644 --- a/app/config/sql/ipeer.sql +++ b/app/config/sql/ipeer.sql @@ -693,7 +693,11 @@ INSERT INTO `email_merges` (`id`, `key`, `value`, `table_name`, `field_name`, `c (1, 'Username', '{{{USERNAME}}}', 'User', 'username', NOW(), NOW()), (2, 'First Name', '{{{FIRSTNAME}}}', 'User', 'first_name', NOW(), NOW()), (3, 'Last Name', '{{{LASTNAME}}}', 'User', 'last_name', NOW(), NOW()), -(4, 'Email Address', '{{{Email}}}', 'User', 'email', NOW(), NOW()); +(4, 'Email Address', '{{{Email}}}', 'User', 'email', NOW(), NOW()), +(5, 'Course Name', '{{{COURSENAME}}}', 'Course', 'course', NOW(), NOW()), +(6, 'Event Title', '{{{EVENTTITLE}}}', 'Event', 'title', NOW(), NOW()), +(7, 'Event Due Date', '{{{DUEDATE}}}', 'Event', 'due_date', NOW(), NOW()), +(8, 'Event Close Date', '{{{CLOSEDATE}}}', 'Event', 'release_date_end', NOW(), NOW()); -- -------------------------------------------------------- diff --git a/app/config/sql/ipeer_samples_data.sql b/app/config/sql/ipeer_samples_data.sql index aec545a51..e6d05c4c9 100644 --- a/app/config/sql/ipeer_samples_data.sql +++ b/app/config/sql/ipeer_samples_data.sql @@ -765,7 +765,11 @@ INSERT INTO `email_merges` (`id`, `key`, `value`, `table_name`, `field_name`, `c (1, 'Username', '{{{USERNAME}}}', 'User', 'username', NOW(), NOW()), (2, 'First Name', '{{{FIRSTNAME}}}', 'User', 'first_name', NOW(), NOW()), (3, 'Last Name', '{{{LASTNAME}}}', 'User', 'last_name', NOW(), NOW()), -(4, 'Email Address', '{{{Email}}}', 'User', 'email', NOW(), NOW()); +(4, 'Email Address', '{{{Email}}}', 'User', 'email', NOW(), NOW()), +(5, 'Course Name', '{{{COURSENAME}}}', 'Course', 'course', NOW(), NOW()), +(6, 'Event Title', '{{{EVENTTITLE}}}', 'Event', 'title', NOW(), NOW()), +(7, 'Event Due Date', '{{{DUEDATE}}}', 'Event', 'due_date', NOW(), NOW()), +(8, 'Event Close Date', '{{{CLOSEDATE}}}', 'Event', 'release_date_end', NOW(), NOW()); -- -------------------------------------------------------- diff --git a/app/controllers/events_controller.php b/app/controllers/events_controller.php index 92fc43951..68fb7d6f8 100644 --- a/app/controllers/events_controller.php +++ b/app/controllers/events_controller.php @@ -14,7 +14,7 @@ class EventsController extends AppController public $helpers = array('Html', 'Ajax', 'Javascript', 'Time'); public $uses = array('GroupEvent', 'User', 'Group', 'Course', 'Event', 'EventTemplateType', 'SimpleEvaluation', 'Rubric', 'Mixeval', 'Personalize', 'GroupsMembers', 'Penalty', 'Survey','EmailSchedule', - 'EvaluationSubmission'); + 'EvaluationSubmission', 'EmailTemplate'); public $components = array("AjaxList", "Session", "RequestHandler","Email"); /** @@ -348,6 +348,7 @@ function add($courseId) $this->Rubric->getBelongingOrPublic($this->Auth->user('id')) ); $emailReminders = array('0'=> 'Disable', '1' => '1 Day', '2'=>'2 Days','3'=>'3 Days','4'=>'4 Days','5'=>'5 Days','6'=>'6 Days','7'=>'7 Days'); + $this->set('emailTemplates', $this->EmailTemplate->getPermittedEmailTemplate(User::get('id'), 'list')); $this->set('emailSchedules', $emailReminders); $this->set('course_id', $courseId); @@ -399,6 +400,7 @@ function setSchedule($eventId, $eventData) return; } + $emailTemp = $eventData['Event']['EmailTemplate']; $courseId = $this->Event->getCourseByEventId($eventId); //Get the startdate, duedate and frequency of emails $startDate = $eventData['Event']['release_date_begin']; @@ -415,8 +417,8 @@ function setSchedule($eventId, $eventData) $data['course_id']= $courseId; $data['event_id'] = $eventId; $data['from'] = $this->Auth->user('id'); - $data['subject'] = $courseName.' - iPeer '.$type.' Reminder'; - $data['content'] = ''; + $data['subject'] = ''; + $data['content'] = $emailTemp; //saving email template id $data['to'] = 'save_reminder;'.implode(';', $to); while (strtotime($startDate) < strtotime($dueDate)) { @@ -475,6 +477,10 @@ function edit($eventId) $orig_email_frequency = $this->calculateFrequency($eventId); $this->set('email_schedule', $orig_email_frequency); + $emailTemp = $this->EmailSchedule->find('first', array( + 'conditions' => array('EmailSchedule.sent' => 0, 'EmailSchedule.event_id' => $eventId) + )); + $this->set('emailId', $emailTemp['EmailSchedule']['content']); $event = $this->Event->getEventById($eventId); if (!empty($this->data)) { @@ -516,7 +522,7 @@ function edit($eventId) $this->data = $this->_multiMap($this->data); if ($this->Event->saveAll($this->data)) { $this->Session->setFlash("Edit event successful!", 'good'); - if ($this->checkIfChanged($event, $this->data, $orig_email_frequency)) { + if ($this->checkIfChanged($event, $this->data, $orig_email_frequency, $emailTemp)) { // only delete emails that haven't been sent $this->EmailSchedule->deleteAll(array('event_id' => $eventId, 'sent' => 0), false); $this->setSchedule($eventId, $this->data); @@ -567,6 +573,7 @@ function edit($eventId) $this->set('mixevalSelected', $event['Event']['template_id']); } $emailReminders = array('0'=> 'Disable', '1' => '1 Day', '2'=>'2 Days','3'=>'3 Days','4'=>'4 Days','5'=>'5 Days','6'=>'6 Days','7'=>'7 Days'); + $this->set('emailTemplates', $this->EmailTemplate->getPermittedEmailTemplate(User::get('id'), 'list')); $this->set('emailSchedules', $emailReminders); $this->set('event', $event); @@ -581,11 +588,12 @@ function edit($eventId) * @param mixed $event * @param mixed $data * @param int $email_frequency + * @param int $originalTemp original template id * * @access public * @return bool - return 1 if the data has been modified else returns 0 **/ - function checkIfChanged($event, $data, $email_frequency) + function checkIfChanged($event, $data, $email_frequency, $originalTemp) { $orig_release_date_begin = $event['Event']['release_date_begin']; $orig_due_date = $event['Event']['due_date']; @@ -593,9 +601,10 @@ function checkIfChanged($event, $data, $email_frequency) $new_due_date = $data['Event']['due_date']; $orig_frequency = $email_frequency; $new_frequency = $data['Event']['email_schedule']; + $new_template = $data['Event']['EmailTemplate']; if ($orig_release_date_begin != $new_release_date_begin || $orig_due_date != $new_due_date - || $orig_frequency != $new_frequency) { + || $orig_frequency != $new_frequency || $originalTemp != $new_template) { return 1; } else { return 0; diff --git a/app/models/email_template.php b/app/models/email_template.php index d17e474c8..37868cd88 100644 --- a/app/models/email_template.php +++ b/app/models/email_template.php @@ -40,7 +40,8 @@ function getPermittedEmailTemplate($user_id, $type= 'all') 'conditions' => array('OR' => array( array('creator_id' => $user_id), array('availability' => '1') - )) + )), + 'order' => 'name ASC' )); } } diff --git a/app/tests/cases/controllers/events_controller.test.php b/app/tests/cases/controllers/events_controller.test.php index 8ebd58bbc..7624bf3ef 100644 --- a/app/tests/cases/controllers/events_controller.test.php +++ b/app/tests/cases/controllers/events_controller.test.php @@ -43,7 +43,7 @@ class EventsControllerTest extends ExtendedAuthTestCase { 'app.rubrics_criteria_comment', 'app.rubrics_lom', 'app.simple_evaluation', 'app.survey_input', 'app.mixeval_question', 'app.mixeval_question_desc', 'app.mixeval', 'app.mixeval_question_type', - 'app.email_schedule' + 'app.email_schedule', 'app.email_template' ); function startCase() { @@ -183,6 +183,7 @@ function testAddWithData() { 'result_release_date_begin' => '2012-11-30 00:00:01', 'result_release_date_end' => '2022-12-12 00:00:01', 'email_schedule' => 0, + 'EmailTemplate' => 2, ), 'Group' => array( 'Group' => array(1,2) @@ -195,7 +196,7 @@ function testAddWithData() { ); $model = ClassRegistry::init('Event'); $event = $model->find('first', array( 'conditions' => array('title' => 'new evaluation'), 'contain' => array('Group', 'GroupEvent', 'EvaluationSubmission'))); - unset($data['Event']['SimpleEvaluation'], $data['Event']['email_schedule']); + unset($data['Event']['SimpleEvaluation'], $data['Event']['email_schedule'], $data['Event']['EmailTemplate']); $data['Event']['template_id'] = 1; foreach ($data['Event'] as $key => $expected) { $this->assertEqual($event['Event'][$key], $expected); @@ -282,6 +283,7 @@ function testEditWithData() { 'result_release_date_begin' => '2012-11-30 00:00:01', 'result_release_date_end' => '2022-12-12 00:00:01', 'email_schedule' => 0, + 'EmailTemplate' => 2, ), 'Group' => array( 'Group' => array(1,2) @@ -294,7 +296,7 @@ function testEditWithData() { ); $model = ClassRegistry::init('Event'); $event = $model->find('first', array( 'conditions' => array('id' => $data['Event']['id']), 'contain' => array('Group', 'GroupEvent', 'EvaluationSubmission'))); - unset($data['Event']['SimpleEvaluation'], $data['Event']['email_schedule']); + unset($data['Event']['SimpleEvaluation'], $data['Event']['email_schedule'], $data['Event']['EmailTemplate']); $data['Event']['template_id'] = 1; foreach ($data['Event'] as $key => $expected) { $this->assertEqual($event['Event'][$key], $expected); diff --git a/app/tests/cases/models/email_merge.test.php b/app/tests/cases/models/email_merge.test.php index 2173190f3..3a1254df7 100644 --- a/app/tests/cases/models/email_merge.test.php +++ b/app/tests/cases/models/email_merge.test.php @@ -37,7 +37,8 @@ function endTest($method) function testGetMergeList() { $mergeList = $this->EmailMerge->getMergeList(); - $expectedResults = array('{{{USERNAME}}}' => 'Username', '{{{FIRSTNAME}}}' => 'First Name', '{{{LASTNAME}}}' => 'Last Name', '{{{Email}}}' => 'Email Address'); + $expectedResults = array('{{{USERNAME}}}' => 'Username', '{{{FIRSTNAME}}}' => 'First Name', '{{{LASTNAME}}}' => 'Last Name', '{{{Email}}}' => 'Email Address', + '{{{COURSENAME}}}' => 'Course Name', '{{{EVENTTITLE}}}' => 'Event Title','{{{DUEDATE}}}' => 'Event Due Date', '{{{CLOSEDATE}}}' => 'Event Close Date'); $this->assertEqual($mergeList, $expectedResults); } diff --git a/app/tests/cases/models/email_template.test.php b/app/tests/cases/models/email_template.test.php index 3aae79efe..e7f2a22b9 100644 --- a/app/tests/cases/models/email_template.test.php +++ b/app/tests/cases/models/email_template.test.php @@ -40,14 +40,14 @@ function testGetPermittedEmailTemplate() //Test on valid input w/ find all $templates = $this->EmailTemplate->getPermittedEmailTemplate('1', 'all'); $this->assertEqual(count($templates), 4); - $this->assertEqual($templates[0]['EmailTemplate']['id'], 1); - $this->assertEqual($templates[1]['EmailTemplate']['id'], 2); - $this->assertEqual($templates[2]['EmailTemplate']['id'], 3); - $this->assertEqual($templates[3]['EmailTemplate']['id'], 4); - $this->assertEqual($templates[0]['EmailTemplate']['name'], 'Submission Confirmation'); - $this->assertEqual($templates[1]['EmailTemplate']['name'], 'Email template example'); - $this->assertEqual($templates[2]['EmailTemplate']['name'], 'Email template example2'); - $this->assertEqual($templates[3]['EmailTemplate']['name'], 'Email template example3'); + $this->assertEqual($templates[0]['EmailTemplate']['id'], 2); + $this->assertEqual($templates[1]['EmailTemplate']['id'], 3); + $this->assertEqual($templates[2]['EmailTemplate']['id'], 4); + $this->assertEqual($templates[3]['EmailTemplate']['id'], 1); + $this->assertEqual($templates[0]['EmailTemplate']['name'], 'Email template example'); + $this->assertEqual($templates[1]['EmailTemplate']['name'], 'Email template example2'); + $this->assertEqual($templates[2]['EmailTemplate']['name'], 'Email template example3'); + $this->assertEqual($templates[3]['EmailTemplate']['name'], 'Submission Confirmation'); //Test on valid input w/ find list $templates = $this->EmailTemplate->getPermittedEmailTemplate('1', 'list'); diff --git a/app/vendors/shells/send_emails.php b/app/vendors/shells/send_emails.php index 5155ab732..fb77a6950 100644 --- a/app/vendors/shells/send_emails.php +++ b/app/vendors/shells/send_emails.php @@ -14,7 +14,8 @@ class SendEmailsShell extends Shell { public $uses = array('User', 'EmailSchedule', 'SysParameter', 'EmailMerge', 'Event', - 'Group', 'GroupsMembers', 'EvaluationSubmission', 'GroupEvent', 'Course', 'Penalty'); + 'Group', 'GroupsMembers', 'EvaluationSubmission', 'GroupEvent', 'Course', 'Penalty', + 'EmailTemplate'); const EMAIL_TASK_LOCK = 'tmp/email_task_lock'; /** * main @@ -70,18 +71,46 @@ function main() //Returns the modified emaillist if the list contains the 'save_reminder' param, else returns $e['to'] $filter_email_list = $this->reminderFilter($event_id, $e['to'], $e['id'], $e['date']); - //If event id is set it is a event reminder. - $template = isset($event_id) ? 'eventReminder' : 'default'; - if (isset($event_id)) { - $event = $this->Event->findById($event_id); - $type = ($event['Event']['event_template_type_id'] == 3) ? 'survey' : 'peer evaluation'; - $controller->set('event', $event); - $controller->set('course', $this->Course->findById($event['Event']['course_id'])); - $controller->set('type', $type); - $controller->set('penalty', $this->Penalty->findAllByEventId($event_id)); - $controller->set('url', $this->SysParameter->get('system.absolute_url')); + // storing common data for all emails in email_list + $commonData = array(); + if (isset($e['event_id'])) { + $event = $this->Event->getEventById($e['event_id']); + $commonData['Event'] = $event['Event']; + // fill in email template subject/content for event reminders + $emailTemplate = $this->EmailTemplate->findById($e['content']); + $e['subject'] = $emailTemplate['EmailTemplate']['subject']; + $e['content'] = $emailTemplate['EmailTemplate']['content']; } - + if (isset($e['course_id'])) { + $course = $this->Course->getCourseById($e['course_id']); + $commonData['Course'] = $course['Course']; + } + + //Return array $matches that contains all tags + preg_match_all('/'.EmailMerge::MERGE_START.'(.*?)'.EmailMerge::MERGE_END.'/', $e['content'], $matches, PREG_OFFSET_CAPTURE); + $patterns = array(); + $replacements = array(); + $tables = array(); + foreach ($matches[0] as $key => $match) { + $table = $this->EmailMerge->getFieldAndTableNameByValue($match[0]); + + if (isset($commonData[$table['table_name']])) { + // if in commonData, grab the field's value + $patterns[$key] = '/'.$match[0].'/'; + $value = $commonData[$table['table_name']][$table['field_name']]; + $replacements[$key] = strtotime($value) ? date('l, F j, Y g:i a',strtotime($value)) : $value; + } else { + // if not in commonData, save table attributes for merging later + if (!isset($tables[$table['table_name']])) { + $tables[$table['table_name']] = array(); + } + // format: array[table_name][field_name] = pattern + $tables[$table['table_name']][$table['field_name']] = '/'.$match[0].'/'; + } + } + // email content after merging common data + $content = preg_replace($patterns, $replacements, $e['content']); + $emailList = $this->User->getEmails(explode(';', $filter_email_list)); foreach ($emailList as $to_id => $to) { if (empty($to)) { @@ -90,11 +119,11 @@ function main() } $subject = $e['subject']; - if (isset($event_id)) { - $controller->set('user', $this->User->findById($to_id)); + if (!empty($tables)) { + // merge data not in common data + $content = $this->doMerge($content, EmailMerge::MERGE_START, EmailMerge::MERGE_END, $tables, $to_id); } - $content = $this->doMerge($e['content'], EmailMerge::MERGE_START, EmailMerge::MERGE_END, $to_id); - if ($this->sendEmail($content, $subject, $from, $to, $template)) { + if ($this->sendEmail($content, $subject, $from, $to)) { $successCount++; } else { echo "Failed to send email to ".$to."\n"; @@ -175,30 +204,24 @@ private function getEmailAddress($id) { * @param string $string string with merge fields * @param int $start start of merge field * @param int $end end of merge field + * @param array $tables list of fields needed to be merged * @param int $user_id user id * * @return merged string */ - function doMerge($string, $start, $end, $user_id = null) + function doMerge($string, $start, $end, $tables, $user_id) { - //Return array $matches that contains all tags - preg_match_all('/'.$start.'(.*?)'.$end.'/', $string, $matches, PREG_OFFSET_CAPTURE); - $patterns = array(); - $replacements = array(); - $patterns = $matches[0]; - foreach ($matches[0] as $key => $match) { - $patterns[$key] = '/'.$match[0].'/'; - - $table = $this->EmailMerge->getFieldAndTableNameByValue($match[0]); - $table_name = $table['table_name']; - $field_name = $table['field_name']; - $this->$table_name->recursive = -1; - $value = $this->$table_name->find('first', array( - 'conditions' => array($table_name.'.id' => $user_id), - 'fields' => $field_name + foreach ($tables as $name => $attributes) { + $fields = array_keys($attributes); + $patterns = array_values($attributes); + $replacements = array(); + $value = $this->$name->find('first', array( + 'conditions' => array($name.'.id' => $user_id), + 'fields' => $fields )); - - $replacements[$key] = $value[$table_name][$field_name]; + foreach ($fields as $key => $field) { + $replacements[$key] = $value[$name][$field]; + } } return preg_replace($patterns, $replacements, $string); } diff --git a/app/views/events/add.ctp b/app/views/events/add.ctp index be1db6912..d1329dc62 100644 --- a/app/views/events/add.ctp +++ b/app/views/events/add.ctp @@ -75,6 +75,11 @@ echo $this->Form->input( Form->input('EmailTemplate', + array('div' => array('id' => 'EmailTemplateDiv'), 'label' => $html->link('Preview', '', array('id' => 'prevE', 'target' => '_blank')))); +?> + +Form->input('Group', array('div' => array('id' => 'GroupsDiv'), 'label' => 'Group(s)')); ?>
    @@ -165,6 +170,10 @@ jQuery("#EventSimpleEvaluation").change(updatePreview); jQuery("#EventRubric").change(updatePreview); jQuery("#EventSurvey").change(updatePreview); jQuery("#EventMixeval").change(updatePreview); +jQuery("#EventEmailSchedule").change(toggleEmailTemplate); +jQuery("#EventEmailTemplate").change(updateEmailPreview); +updateEmailPreview(); +toggleEmailTemplate(); // for redirecting to the add event view for the selected course changeCourseId(); // attach event handlers to deal with changes in course selection @@ -307,4 +316,23 @@ function updatePreview() { jQuery("#prevM").attr("href", url + eventIdToPrev); } } + +// update email template id for the preview link +function updateEmailPreview() { + var emailId = jQuery("#EventEmailTemplate").val(); + var url = "base; ?>/emailtemplates/view/" + jQuery("#prevE").attr("href", url + emailId); +} + +// show / hide email template input +function toggleEmailTemplate() { + var freq = jQuery("#EventEmailSchedule").val(); + if (freq == 0) { + jQuery('div#EmailTemplateDiv').hide(); + jQuery('.email-temp-help-text').hide(); + } else { + jQuery('div#EmailTemplateDiv').show(); + jQuery('.email-temp-help-text').show(); + } +} diff --git a/app/views/events/edit.ctp b/app/views/events/edit.ctp index 8d032a79e..08a29c33b 100644 --- a/app/views/events/edit.ctp +++ b/app/views/events/edit.ctp @@ -107,6 +107,12 @@ echo $this->Form->input( Form->input('EmailTemplate', + array('div' => array('id' => 'EmailTemplateDiv'), 'label' => $html->link('Preview', '', array('id' => 'prevE', 'target' => '_blank')), + 'selected' => $emailId)); +?> + +Form->input('Group', array('div' => array('id' => 'GroupsDiv'), 'label' => 'Group(s)')); ?>
    @@ -199,6 +205,10 @@ jQuery("#EventSimpleEvaluation").change(updatePreview); jQuery("#EventRubric").change(updatePreview); jQuery("#EventSurvey").change(updatePreview); jQuery("#EventMixeval").change(updatePreview); +jQuery("#EventEmailSchedule").change(toggleEmailTemplate); +jQuery("#EventEmailTemplate").change(updateEmailPreview); +updateEmailPreview(); +toggleEmailTemplate(); // select all groups jQuery("#selectAll").click(function() { jQuery("#GroupGroup option").prop('selected', true); @@ -328,4 +338,23 @@ function updatePreview() { prevM.href = url + eventIdToPrev; } } + +// update email template id for the preview link +function updateEmailPreview() { + var emailId = jQuery("#EventEmailTemplate").val(); + var url = "base; ?>/emailtemplates/view/" + jQuery("#prevE").attr("href", url + emailId); +} + +// show / hide email template input +function toggleEmailTemplate() { + var freq = jQuery("#EventEmailSchedule").val(); + if (freq == 0) { + jQuery('div#EmailTemplateDiv').hide(); + jQuery('.email-temp-help-text').hide(); + } else { + jQuery('div#EmailTemplateDiv').show(); + jQuery('.email-temp-help-text').show(); + } +} diff --git a/app/webroot/css/ipeer.css b/app/webroot/css/ipeer.css index 07bd1a149..9bb638d53 100644 --- a/app/webroot/css/ipeer.css +++ b/app/webroot/css/ipeer.css @@ -1004,7 +1004,7 @@ i { margin-bottom: 0.5em; } -#Events form div.email-help-text { +#Events form div.email-help-text, #Events form div.email-temp-help-text { margin: 0.5em 0 1em 24em; font-size: 0.8em; width: 35em; From 175ed18f3720235642c6f6e779248cdbcfbefe73 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 17 Mar 2014 14:38:06 -0700 Subject: [PATCH 68/91] modified emailer view to view event reminders properly I have modified emailer view to always print out the email template's content instead of having the option of printing an element view, which was used when the event reminder was a standard text that cannot be modified. I have fixed saving event reminders to also save the email template's subject line, which was not done in the previous commit. Lastly, I removed the eventReminder email element, since it is no longer in use. --- app/controllers/emailer_controller.php | 15 +++++-------- app/controllers/events_controller.php | 5 +++-- .../elements/email/html/eventReminder.ctp | 22 ------------------- .../elements/email/text/eventReminder.ctp | 12 ---------- app/views/emailer/view.ctp | 6 +---- 5 files changed, 10 insertions(+), 50 deletions(-) delete mode 100644 app/views/elements/email/html/eventReminder.ctp delete mode 100644 app/views/elements/email/text/eventReminder.ctp diff --git a/app/controllers/emailer_controller.php b/app/controllers/emailer_controller.php index c8fea622d..b888f0b79 100644 --- a/app/controllers/emailer_controller.php +++ b/app/controllers/emailer_controller.php @@ -319,20 +319,17 @@ function view ($id) $this->redirect('index'); } } + + // event reminders - grab email template's content + if (isset($email['EmailSchedule']['event_id'])) { + $template = $this->EmailTemplate->findById($email['EmailSchedule']['content']); + $email['EmailSchedule']['content'] = $template['EmailTemplate']['content'] ? $template['EmailTemplate']['content'] : ""; + } $email['EmailSchedule']['to'] = explode(';', $email['EmailSchedule']['to']); $email['EmailSchedule']['content'] = str_replace("\n", '
    ', $email['EmailSchedule']['content']); $this->User->recursive = -1; $email['User'] = $this->User->findAllById($email['EmailSchedule']['to']); - // event reminders - if (isset($email['EmailSchedule']['event_id'])) { - $event = $this->Event->findById($email['EmailSchedule']['event_id']); - $user = array('User' => array('full_name' => 'Name')); - $type = ($event['Event']['event_template_type_id'] == 3) ? 'survey' : 'peer evaluation'; - $url = Router::url('/', true); - $this->set('params', array('event' => $event, 'course' => array('Course' => $event['Course']), - 'penalty' => $event['Penalty'], 'user' => $user, 'type' => $type, 'url' => $url)); - } $this->set('data', $email); } diff --git a/app/controllers/events_controller.php b/app/controllers/events_controller.php index 68fb7d6f8..1f10836db 100644 --- a/app/controllers/events_controller.php +++ b/app/controllers/events_controller.php @@ -401,6 +401,8 @@ function setSchedule($eventId, $eventData) } $emailTemp = $eventData['Event']['EmailTemplate']; + $template = $this->EmailTemplate->findById($emailTemp); + $subject = $template['EmailTemplate']['subject']; $courseId = $this->Event->getCourseByEventId($eventId); //Get the startdate, duedate and frequency of emails $startDate = $eventData['Event']['release_date_begin']; @@ -410,14 +412,13 @@ function setSchedule($eventId, $eventData) $emailFreq = '+' . $emailFreq . ' day'; $courseName = $this->Course->getCourseName($courseId); - $type = ($eventData['Event']['event_template_type_id'] == 3) ? 'Survey' : 'Evaluation'; //Prepare the data for pushing to the email_schedules table $data = array(); $data['course_id']= $courseId; $data['event_id'] = $eventId; $data['from'] = $this->Auth->user('id'); - $data['subject'] = ''; + $data['subject'] = $subject; $data['content'] = $emailTemp; //saving email template id $data['to'] = 'save_reminder;'.implode(';', $to); diff --git a/app/views/elements/email/html/eventReminder.ctp b/app/views/elements/email/html/eventReminder.ctp deleted file mode 100644 index ebc084b69..000000000 --- a/app/views/elements/email/html/eventReminder.ctp +++ /dev/null @@ -1,22 +0,0 @@ -

    - -

    -

    - -

    -
      -
    • -
    • -
    • -
    -'.__('here', true).''.__(' to complete the ', true). - $type.__(' before it closes.', true); -if (!empty($penalty)) { - echo __(' There is a penalty for submitting after the due date.', true); -} -?> -

    - -

    \ No newline at end of file diff --git a/app/views/elements/email/text/eventReminder.ctp b/app/views/elements/email/text/eventReminder.ctp deleted file mode 100644 index 2a683a427..000000000 --- a/app/views/elements/email/text/eventReminder.ctp +++ /dev/null @@ -1,12 +0,0 @@ -
    - element('email/html/eventReminder', $params); - } else { - echo $data['EmailSchedule']['content']; - } ?> +
    From 8008d92ce057786031c1d6cfd7dcc128a88fc98a Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 17 Mar 2014 15:24:16 -0700 Subject: [PATCH 69/91] Fixed rubric template preview I fixed the errors of missing variables in the rubrics template preview by adding the missing variables in the RubricEval demo data. I've also remove the use of "_t" from some of the ctp files which were left when we transition back to __("", true). --- app/libs/toolkit.php | 10 ++++++++++ app/views/elements/evaluations/rubric_eval_form.ctp | 4 ++-- app/views/elements/evaluations/simple_eval_form.ctp | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/libs/toolkit.php b/app/libs/toolkit.php index a22feb1d4..72b9f0fbb 100644 --- a/app/libs/toolkit.php +++ b/app/libs/toolkit.php @@ -224,11 +224,15 @@ static function getRubricEvalDemoData() 'due_date' => Toolkit::formatDate(time()+(5*24*60*60)), 'description' => 'Preview for rubric evaluation event.', 'com_req' => true, + 'course_id' => 0, ), 'Group' => array( 'id' => 0, 'group_name' => 'Demo Group', ), + 'GroupEvent' => array( + 'id' => 0, + ), ), 'groupMembers' => array( array( @@ -258,6 +262,12 @@ static function getRubricEvalDemoData() 'evaluateeCount' => 2, 'fullName' => User::get('full_name'), 'preview' => true, + 'viewData' => array( + 'id' => 0, + ), + 'allDone' => 0, + 'comReq' => 0, + 'userIds' => array(), ); } diff --git a/app/views/elements/evaluations/rubric_eval_form.ctp b/app/views/elements/evaluations/rubric_eval_form.ctp index ced163965..86b15770a 100644 --- a/app/views/elements/evaluations/rubric_eval_form.ctp +++ b/app/views/elements/evaluations/rubric_eval_form.ctp @@ -63,8 +63,8 @@ function saveButtonVal(userId) {
  • NOTE: You can click the "Submit to Complete the Evaluation" button only AFTER all evaluations are completed.')?>
  • - '._t("Evaluation's release end date").'' : Toolkit::formatDate($event['Event']['release_date_end']); ?> -
  • + '.__("Evaluation's release end date", true).'' : Toolkit::formatDate($event['Event']['release_date_end']); ?> +
  • diff --git a/app/views/elements/evaluations/simple_eval_form.ctp b/app/views/elements/evaluations/simple_eval_form.ctp index 621687081..f55a3d28c 100644 --- a/app/views/elements/evaluations/simple_eval_form.ctp +++ b/app/views/elements/evaluations/simple_eval_form.ctp @@ -154,7 +154,7 @@
  • ('.__('Required', true).') ' : '('.__('Optional', true).')' ;?> .
  • - '._t("Evaluation's release end date").'' : Toolkit::formatDate($event['Event']['release_date_end']); ?> + '.__("Evaluation's release end date", true).'' : Toolkit::formatDate($event['Event']['release_date_end']); ?>
  • From 47fa7362073b1abb2b86fdf58f86ce17fc0bdb6a Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 17 Mar 2014 15:45:50 -0700 Subject: [PATCH 70/91] removed resetpasswordpermission check from users index Somehow the permissions checking function was left in the index when it was designed only for the two reset password functions. --- app/controllers/events_controller.php | 2 +- app/controllers/users_controller.php | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/controllers/events_controller.php b/app/controllers/events_controller.php index 1f10836db..e350acf35 100644 --- a/app/controllers/events_controller.php +++ b/app/controllers/events_controller.php @@ -589,7 +589,7 @@ function edit($eventId) * @param mixed $event * @param mixed $data * @param int $email_frequency - * @param int $originalTemp original template id + * @param int $originalTemp original template id * * @access public * @return bool - return 1 if the data has been modified else returns 0 diff --git a/app/controllers/users_controller.php b/app/controllers/users_controller.php index ffde8352c..3f444f019 100644 --- a/app/controllers/users_controller.php +++ b/app/controllers/users_controller.php @@ -216,8 +216,6 @@ function index($message='') $this->Session->setFlash('You do not have permission to view users.'); $this->redirect('/home'); } - - $this->_checkResetPasswordPermission(1,1); // Set the top message $this->set('message', $message); From 47564ed021d7ebe637188a5973e443ed63ae61f9 Mon Sep 17 00:00:00 2001 From: Compass Date: Sun, 23 Mar 2014 00:06:11 -0700 Subject: [PATCH 71/91] Move importing sample data into puppet module --- app/plugins/guard | 2 +- puppet/bootstrap.sh | 9 --------- puppet/dev.pp | 1 + puppet/modules/ipeer | 2 +- 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/app/plugins/guard b/app/plugins/guard index 329960c13..25f26ab4b 160000 --- a/app/plugins/guard +++ b/app/plugins/guard @@ -1 +1 @@ -Subproject commit 329960c13761bdfbd591251871aea5fb1c5bc540 +Subproject commit 25f26ab4b9b6593be943a804276edc5d61fdb9da diff --git a/puppet/bootstrap.sh b/puppet/bootstrap.sh index 28e190e6a..138a0ad8e 100755 --- a/puppet/bootstrap.sh +++ b/puppet/bootstrap.sh @@ -1,12 +1,3 @@ -# import sample data into database named ipeer -mysql -u ipeer -pipeer -h `hostname` ipeer < /var/www/app/config/sql/ipeer_samples_data.sql - -# install oauth php extension required for tests -#yum -y install php-devel -#yum -y install pcre-devel -#pecl install oauth -#echo 'extension=oauth.so' > /etc/php.d/oauth.ini - # install phing pear config-set auto_discover 1 pear channel-discover pear.phing.info diff --git a/puppet/dev.pp b/puppet/dev.pp index c3a913f19..f09cd31fe 100644 --- a/puppet/dev.pp +++ b/puppet/dev.pp @@ -10,6 +10,7 @@ db_host => $fqdn, port => 2000, local_config => false, + import_sample_data => true, } # create ipeer_test database for tests diff --git a/puppet/modules/ipeer b/puppet/modules/ipeer index 388dff30b..53d81c1d8 160000 --- a/puppet/modules/ipeer +++ b/puppet/modules/ipeer @@ -1 +1 @@ -Subproject commit 388dff30b189a96b404629b2f330d932100c9d45 +Subproject commit 53d81c1d818f5afbdc7eb668ae270c7dc3b979e0 From a487ccea4dbc3a40c2ca8273a35fb746cd04aaee Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Wed, 19 Mar 2014 15:00:44 -0700 Subject: [PATCH 72/91] Added cron job to send unsent scheduled emails every 5 minutes I've used puppet to set up a cron job that sends unsent emails that are scheduled to be sent every 5 minutes --- puppet/dev.pp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/puppet/dev.pp b/puppet/dev.pp index f09cd31fe..39c693c98 100644 --- a/puppet/dev.pp +++ b/puppet/dev.pp @@ -30,3 +30,9 @@ ensure => absent, notify => Service["nginx"] } + +cron { sendemails: + command => "cd /var/www && sh cake/console/cake send_emails", + user => root, + minute => "*/5" +} From 253192865e16204acaa366e09753b1c546a4cb95 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Fri, 28 Mar 2014 14:47:09 -0700 Subject: [PATCH 73/91] Added the ability to un/release specific comments for rubric evaluations This is the first commit for allowing instructors to un/release specific comments of a rubric evaluation (similar to what can be currently done with rubric evaluations). Included in this commit is: * modifications to the sql scripts (include upgrade scripts) to include an attribute to mark whether each specific comment is released * buttons to "Save changes" of releasing the selected comments * buttons to "Un/release all" comments for an evaluatee or the whole group * internal check to mark a group_event as reviewed if all of the evaluation_details in the group has been modified after the close date of the evaluation - in other words, the detail was marked as released or unreleased using Save Changes or un/release all (or combination of both). Along with this additional feature we have remodelled the process of un/releasing evaluation results, which is described below. We also took into account the possibility of an instructor changing the auto-release attribute BEFORE and AFTER the close date of the event. * BEFORE close date * grades/comments release links/buttons would not be visible, to remove the ambiguity of whether the results have been reviewed * if auto-release is turned on, evaluation details are defaulted to have comment_release/grade-release=1 * they are set to zero if auto-release if off * if the auto-release status is changed during this period, all submitted evaluations will be marked appropriately * eg. from off to on - mark all release status to 1 * AFTER close date * grades/comments release links/buttons would be visible * if auto-release is on, students can see the results as soon as the evalution results start date has been reached * if the auto-release status is changed during this period, all submitted evaluations will be marked appropriately IF the group event is not marked as "reviewed". * if the group_event is marked as reviewed, no changes to the release status of the details would occur, because we assume the instructor has reviewed the comments and would like to keep those changes. --- app/config/sql/delta_7.sql | 8 +- app/config/sql/ipeer.sql | 6 +- app/config/sql/ipeer_samples_data.sql | 6 +- app/controllers/components/evaluation.php | 128 +++++++++++++++++- app/controllers/evaluations_controller.php | 30 +++- .../elements/evaluations/rubric_details.ctp | 65 +++++++++ .../view_rubric_evaluation_results_detail.ctp | 103 ++++---------- 7 files changed, 249 insertions(+), 97 deletions(-) create mode 100644 app/views/elements/evaluations/rubric_details.ctp diff --git a/app/config/sql/delta_7.sql b/app/config/sql/delta_7.sql index be8c86378..99bfaaa93 100644 --- a/app/config/sql/delta_7.sql +++ b/app/config/sql/delta_7.sql @@ -510,9 +510,11 @@ INSERT INTO aros_acos (id, aro_id, aco_id, _create, _read, _update, _delete) VAL -- This file contains queries that add a single column to three tables. -- This column is used to hide/show the evaluation marks to the user. -ALTER TABLE mixeval_questions ADD show_marks INT(1) AFTER scale_level; -ALTER TABLE rubrics_criterias ADD show_marks INT(1) AFTER multiplier; -ALTER TABLE rubrics ADD view_mode VARCHAR(10) AFTER criteria; +ALTER TABLE mixeval_questions ADD show_marks INT(1) NOT NULL DEFAULT '0' AFTER scale_level; +ALTER TABLE rubrics_criterias ADD show_marks INT(1) NOT NULL DEFAULT '0' AFTER multiplier; +ALTER TABLE rubrics ADD view_mode VARCHAR(10) NOT NULL DEFAULT 'student' AFTER criteria; +ALTER TABLE evaluation_rubric_details ADD comment_release INT(1) NOT NULL DEFAULT '0' AFTER grade; +ALTER TABLE evaluation_mixeval_details ADD comment_release INT(1) NOT NULL DEFAULT '0' AFTER grade; -- Insert new email merges INSERT INTO `email_merges` (`id`, `key`, `value`, `table_name`, `field_name`, `created`, `modified`) VALUES diff --git a/app/config/sql/ipeer.sql b/app/config/sql/ipeer.sql index 3e1ad5644..97926f9b8 100644 --- a/app/config/sql/ipeer.sql +++ b/app/config/sql/ipeer.sql @@ -760,6 +760,7 @@ CREATE TABLE IF NOT EXISTS `evaluation_mixeval_details` ( `question_comment` text, `selected_lom` int(11) NOT NULL DEFAULT '0', `grade` double(12,2) NOT NULL DEFAULT '0.00', + `comment_release` int(1) NOT NULL DEFAULT '0', `record_status` char(1) NOT NULL DEFAULT 'A', `creator_id` int(11) NOT NULL DEFAULT '0', `created` datetime, @@ -808,6 +809,7 @@ CREATE TABLE IF NOT EXISTS `evaluation_rubric_details` ( `criteria_comment` varchar(255) DEFAULT NULL, `selected_lom` int(11) NOT NULL DEFAULT '0', `grade` double(12,2) NOT NULL DEFAULT '0.00', + `comment_release` int(1) NOT NULL DEFAULT '0', `record_status` char(1) NOT NULL DEFAULT 'A', `creator_id` int(11) NOT NULL DEFAULT '0', `created` datetime, @@ -1077,7 +1079,7 @@ CREATE TABLE IF NOT EXISTS `mixeval_questions` ( `self_eval` tinyint(1) NOT NULL DEFAULT '0', `multiplier` int(11) NOT NULL DEFAULT '0', `scale_level` int(11) NOT NULL DEFAULT '0', - `show_marks` int(1) DEFAULT NULL, + `show_marks` int(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), FOREIGN KEY (`mixeval_question_type_id`) REFERENCES `mixeval_question_types` (`id`) ON DELETE CASCADE, @@ -1320,7 +1322,7 @@ CREATE TABLE IF NOT EXISTS `rubrics_criterias` ( `criteria_num` int(11) NOT NULL DEFAULT '999', `criteria` varchar(255) DEFAULT NULL, `multiplier` int(11) NOT NULL DEFAULT '0', - `show_marks` int(1) DEFAULT NULL, + `show_marks` int(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/app/config/sql/ipeer_samples_data.sql b/app/config/sql/ipeer_samples_data.sql index e6d05c4c9..c8d2b379e 100644 --- a/app/config/sql/ipeer_samples_data.sql +++ b/app/config/sql/ipeer_samples_data.sql @@ -849,6 +849,7 @@ CREATE TABLE IF NOT EXISTS `evaluation_mixeval_details` ( `question_comment` text, `selected_lom` int(11) NOT NULL DEFAULT '0', `grade` double(12,2) NOT NULL DEFAULT '0.00', + `comment_release` int(1) NOT NULL DEFAULT '0', `record_status` char(1) NOT NULL DEFAULT 'A', `creator_id` int(11) NOT NULL DEFAULT '0', `created` datetime, @@ -943,6 +944,7 @@ CREATE TABLE IF NOT EXISTS `evaluation_rubric_details` ( `criteria_comment` varchar(255) DEFAULT NULL, `selected_lom` int(11) NOT NULL DEFAULT '0', `grade` double(12,2) NOT NULL DEFAULT '0.00', + `comment_release` int(1) NOT NULL DEFAULT '0', `record_status` char(1) NOT NULL DEFAULT 'A', `creator_id` int(11) NOT NULL DEFAULT '0', `created` datetime, @@ -1343,7 +1345,7 @@ CREATE TABLE IF NOT EXISTS `mixeval_questions` ( `self_eval` tinyint(1) NOT NULL DEFAULT '0', `multiplier` int(11) NOT NULL DEFAULT '0', `scale_level` int(11) NOT NULL DEFAULT '0', - `show_marks` int(1) DEFAULT NULL, + `show_marks` int(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), FOREIGN KEY (`mixeval_question_type_id`) REFERENCES `mixeval_question_types` (`id`) ON DELETE CASCADE, @@ -1761,7 +1763,7 @@ CREATE TABLE IF NOT EXISTS `rubrics_criterias` ( `criteria_num` int(11) NOT NULL DEFAULT '999', `criteria` varchar(255) DEFAULT NULL, `multiplier` int(11) NOT NULL DEFAULT '0', - `show_marks` int(1) DEFAULT NULL, + `show_marks` int(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/app/controllers/components/evaluation.php b/app/controllers/components/evaluation.php index abb9fcfa8..ae37ec9ae 100644 --- a/app/controllers/components/evaluation.php +++ b/app/controllers/components/evaluation.php @@ -782,8 +782,15 @@ function formatRubricEvaluationResultsMatrix($evalResult) $detail['grade']; $summary[$userId]['individual'][$evaluator][$detail['criteria_number']]['comment'] = $detail['criteria_comment']; + $summary[$userId]['individual'][$evaluator][$detail['criteria_number']]['id'] = + $detail['id']; + $summary[$userId]['individual'][$evaluator][$detail['criteria_number']]['comment_release'] = + $detail['comment_release']; } - $summary[$userId]['individual'][$evaluator]['general_comment'] = $result['EvaluationRubric']['comment']; + $summary[$userId]['individual'][$evaluator]['general_comment']['comment'] = + $result['EvaluationRubric']['comment']; + $summary[$userId]['individual'][$evaluator]['general_comment']['comment_release'] = + $result['EvaluationRubric']['comment_release']; } foreach ($summary as $id => $score) { @@ -841,16 +848,16 @@ function changeRubricEvaluationGradeRelease ($groupEventId, $evaluateeId, $relea /** - * changeRubricEvaluationCommentRelease + * changeRubricEvaluationCommentRelease - DEPRECATED * * @param mixed $groupEventId group event id * @param mixed $evaluateeId evaluatee id - * @param mixed $releaseStatus release status + * @param mixed $params params * * @access public * @return void */ - function changeRubricEvaluationCommentRelease ($groupEventId, $evaluateeId, $releaseStatus) + function changeRubricEvaluationCommentRelease ($groupEventId, $evaluateeId, $params) { $this->EvaluationRubric = ClassRegistry::init('EvaluationRubric'); $this->GroupEvent = ClassRegistry::init('GroupEvent'); @@ -875,7 +882,120 @@ function changeRubricEvaluationCommentRelease ($groupEventId, $evaluateeId, $rel $this->GroupEvent->read(), $releaseStatus, $oppositGradeReleaseCount); $this->GroupEvent->save($groupEvent); } + + /** + * changeIndivRubricEvalCommentRelease + * + * @param mixed $params params + * + * @access public + * @return void + */ + function changeIndivRubricEvalCommentRelease($params) + { + $this->EvaluationRubric = ClassRegistry::init('EvaluationRubric'); + $this->EvaluationRubricDetail = ClassRegistry::init('EvaluationRubricDetail'); + $this->GroupEvent = ClassRegistry::init('GroupEvent'); + $this->Event = ClassRegistry::init('Event'); + + $grpEventId = $params['group_event_id']; + $evaluatee = $params['evaluatee']; + + $now = '"'.date("Y-m-d H:i:s").'"'; + $user = $this->Auth->user('id'); + + $evalRubrIds = $this->EvaluationRubric->find('list', array( + 'conditions' => array('evaluatee' => $evaluatee, 'grp_event_id' => $grpEventId) + )); + // change comment release to 0 for the evaluatee in this group event + $this->EvaluationRubric->updateAll( + array('EvaluationRubric.comment_release' => 0, 'EvaluationRubric.modified' => $now, 'EvaluationRubric.updater_id' => $user), + array('EvaluationRubric.id' => $evalRubrIds) + ); + $this->EvaluationRubricDetail->updateAll( + array('EvaluationRubricDetail.comment_release' => 0, 'EvaluationRubricDetail.modified' => $now, 'EvaluationRubricDetail.updater_id' => $user), + array('EvaluationRubricDetail.evaluation_rubric_id' => $evalRubrIds) + ); + + //release general comments + $genComment = isset($params['releaseGeneralCom']) ? $params['releaseGeneralCom'] : array(); + $this->EvaluationRubric->updateAll( + array('EvaluationRubric.comment_release' => 1, 'EvaluationRubric.modified' => $now, 'EvaluationRubric.updater_id' => $user), + array('EvaluationRubric.evaluatee' => $evaluatee, 'EvaluationRubric.evaluator' => $genComment) + ); + // release detailed comments + $detailComment = isset($params['releaseComments']) ? $params['releaseComments'] : array(); + $this->EvaluationRubricDetail->updateAll( + array('EvaluationRubricDetail.comment_release' => 1, 'EvaluationRubricDetail.modified' => $now, 'EvaluationRubricDetail.updater_id' => $user), + array('EvaluationRubricDetail.id' => $detailComment) + ); + } + + /** + * changeRubricEvalCommentRelease + * + * @param mixed $status status + * @param mixed $grpEventId group event id + * @param mixed $evaluatee evaluatee + * + * @access public + * @return void + */ + function changeRubricEvalCommentRelease($status, $grp_event_id, $evaluatee = null) + { + $this->EvaluationRubric = ClassRegistry::init('EvaluationRubric'); + $this->EvaluationRubricDetail = ClassRegistry::init('EvaluationRubricDetail'); + $this->GroupEvent = ClassRegistry::init('GroupEvent'); + $now = '"'.date("Y-m-d H:i:s").'"'; + $user = $this->Auth->user('id'); + + $conditions = array('grp_event_id' => $grp_event_id); + if ($evaluatee) { + $conditions['evaluatee'] = $evaluatee; + } + + $evalRubrIds = $this->EvaluationRubric->find('list', array('conditions' => $conditions)); + // update all comment release status that meets the conditions + $this->EvaluationRubric->updateAll( + array('EvaluationRubric.comment_release' => $status, 'EvaluationRubric.modified' => $now, 'EvaluationRubric.updater_id' => $user), + array('EvaluationRubric.id' => $evalRubrIds) + ); + $this->EvaluationRubricDetail->updateAll( + array('EvaluationRubricDetail.comment_release' => $status, 'EvaluationRubricDetail.modified' => $now, 'EvaluationRubricDetail.updater_id' => $user), + array('EvaluationRubricDetail.evaluation_rubric_id' => $evalRubrIds) + ); + } + + /** + * markRubricEvalReviewed + * + * @param mixed $eventId + * @param mixed $grpEventId + * + * @access public + * @return void + */ + function markRubricEvalReviewed($eventId, $grpEventId) + { + $this->EvaluationRubric = ClassRegistry::init('EvaluationRubric'); + $this->Event = ClassRegistry::init('Event'); + + // set group event to reviewed if all evaluatees' release status has been modified + $eval = $this->EvaluationRubric->find('first', array( + 'conditions' => array('grp_event_id' => $grpEventId), + 'order' => array('EvaluationRubric.modified ASC') + )); + $event = $this->Event->findById($eventId); + + // if the oldest modified date is after the event's close date + if (strtotime($event['Event']['release_date_end']) <= strtotime($eval['EvaluationRubric']['modified'])) { + // set group event to reviewed + $this->GroupEvent->id = $grpEventId; + $this->GroupEvent->saveField('marked', 'reviewed'); + } + } + /** * loadMixEvaluationDetail * Mixeval Evaluation functions diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index 053c8f5e7..12a1bd3e6 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -1584,7 +1584,7 @@ function markCommentRelease($param = null) // Check whether the event exists or user has permission to access it if (!($event = $this->Event->getAccessibleEventById($eventId, User::get('id'), User::getCourseFilterPermission(), array()))) { - $this->Session->setFlash(__('Error: That event does not exist or you dont have access to it', true)); + $this->Session->setFlash(__('Error: That event does not exist or you don\'t have access to it', true)); $this->redirect('index'); return; } @@ -1603,11 +1603,29 @@ function markCommentRelease($param = null) break; case "2": - $groupId = strtok(';'); - $evaluateeId = strtok(';'); - $groupEventId = strtok(';'); - $releaseStatus = strtok(';'); - $this->Evaluation->changeRubricEvaluationCommentRelease($groupEventId, $evaluateeId, $releaseStatus); + $grpEventId = $this->params['form']['group_event_id']; + $evaluateee = $this->params['form']['evaluatee']; + $eventId = $this->params['form']['event_id']; + $groupId = $this->params['form']['group_id']; + switch ($this->params['form']['submit']) { + case "Save Changes": + $this->Evaluation->changeIndivRubricEvalCommentRelease($this->params['form']); + break; + case "Release All Comments": + $this->Evaluation->changeRubricEvalCommentRelease(1, $grpEventId, $evaluateee); + break; + case "Unrelease All Comments": + $this->Evaluation->changeRubricEvalCommentRelease(0, $grpEventId, $evaluateee); + break; + case "Release Comments": + $this->Evaluation->changeRubricEvalCommentRelease(1, $grpEventId); + break; + case "Unrelease Comments": + $this->Evaluation->changeRubricEvalCommentRelease(0, $grpEventId); + break; + } + // mark group event as reviewed when all evaluations have been looked at by an instructor + $this->Evaluation->markRubricEvalReviewed($eventId, $grpEventId); $this->redirect('viewEvaluationResults/'.$eventId.'/'.$groupId.'/Detail'); break; diff --git a/app/views/elements/evaluations/rubric_details.ctp b/app/views/elements/evaluations/rubric_details.ctp new file mode 100644 index 000000000..9b2d6f9d7 --- /dev/null +++ b/app/views/elements/evaluations/rubric_details.ctp @@ -0,0 +1,65 @@ + + + + + + + +tableHeaders($headers); +$empty = $rubric['lom_max']; +$col = $rubric['criteria'] + 1; +foreach ($result AS $evaluator => $row) { + $class = in_array($evaluator, $notInGroup) ? ' class="blue" ' : ' '; + echo "".$memberList[$evaluator].""; + $comment = array_pop($row); + foreach ($row as $num => $grade) { + echo '"; + } + echo ""; + //General Comment + echo ""; + echo ""; +} +?> +

    '; + //Points Detail + echo "".__('Points', true).": "; + $lom = $grade["grade"]; + + for ($v = 0; $v < $lom; $v++) { + echo $html->image('evaluations/circle.gif', array('align'=>'middle', 'vspace'=>'1', 'hspace'=>'1','alt'=>'circle')); + $empty--; + } + for ($t=0; $t < $empty; $t++) { + echo $html->image('evaluations/circle_empty.gif', array('align'=>'middle', 'vspace'=>'1', 'hspace'=>'1','alt'=>'circle_empty')); + } + echo "
    "; + //Grade Detail + echo "".__('Grade:', true)." "; + echo $grade["grade"] . " / " . $multiplier[$num] . "
    "; + //Comments + $chkParam = array( + 'value' => $grade['id'], + 'hiddenField' => false, + 'name' => 'releaseComments[]', + 'checked' => $grade['comment_release'], + ); + echo "
    "; + echo $form->checkbox($chkParam['name'], $chkParam); + echo "".__('Comment:', true)." "; + echo $grade["comment"]; + echo "
    ".__('General Comment:', true)."
    "; + $checkParam = array( + 'value' => $evaluator, + 'hiddenField' => false, + 'name' => 'releaseGeneralCom[]', + 'checked' => $comment['comment_release'], + ); + echo $form->checkbox($checkParam['name'], $checkParam); + echo $comment['comment']; + echo "

    + + + + \ No newline at end of file diff --git a/app/views/evaluations/view_rubric_evaluation_results_detail.ctp b/app/views/evaluations/view_rubric_evaluation_results_detail.ctp index 0cacaa29b..5e714a37c 100644 --- a/app/views/evaluations/view_rubric_evaluation_results_detail.ctp +++ b/app/views/evaluations/view_rubric_evaluation_results_detail.ctp @@ -91,16 +91,6 @@ if (!empty($notInGroup)) { $penalties[$userId] > 0 ? $penaltyAddOn = ' - '."".$deduction." = ".number_format($scaled[$userId], 2) : $penaltyAddOn = ''; echo $penaltyAddOn.' ('.$percent.'%)'; - // temporarily removed avgscorepercent - /*if (isset($membersAry[$user['id']]['received_ave_score'])) { - $memberAvgScore = number_format($avgPerQues[$user['id']], 2); - $memberAvgScoreDeduction = number_format($avgPerQues[$user['id']] * $penalties[$user['id']] / 100, 2); - $memberAvgScoreScaled = number_format($avgPerQues[$user['id']] * (1 - ($penalties[$user['id']] / 100)), 2); - $memberAvgScorePercent = number_format($avgPerQues[$user['id']] * (1 - ($penalties[$user['id']] / 100)) * 100); - } else { - $memberAvgScore = '-'; - $memberAvgScorePercent = '-'; - }*/ if ($scaled[$userId] == $groupAve) { echo "  ((".__("Same Mark as Group Average", true)." ))
    "; } else if ($scaled[$userId] < $groupAve) { @@ -108,89 +98,42 @@ if (!empty($notInGroup)) { } else if ($scaled[$userId] > $groupAve) { echo "  << ".__('Above Group Average', true)." >>
    "; } - // temporarily removed avgscorepercent - /*echo __("Average Percentage Per Question: ", true); - echo $memberAvgScore; - $penalties[$user['id']] > 0 ? $penaltyAddOn = ' - '."".$memberAvgScoreDeduction." = ".$memberAvgScoreScaled : - $penaltyAddOn = ''; - echo $penaltyAddOn.' ('.$memberAvgScorePercent.'%)
    ';*/ (isset($penalties[$userId]) && $penalties[$userId] > 0) ? $penaltyNotice = 'NOTE: '.$penalties[$userId].'% Late Penalty
    ' : $penaltyNotice = '
    '; echo $penaltyNotice; ?>

    - tableHeaders($this->Evaluation->getIndividualRubricHeader($rubric['RubricsCriteria'])); - //Retrieve the individual rubric detail - if (isset($scoreRecords[$userId])) { - $memberResult = $scoreRecords[$userId]['individual']; - foreach ($memberResult AS $evaluator => $row) { - in_array($evaluator, Set::extract($notInGroup, '/User/id')) ? $class=' class="blue" ' : $class=' '; - echo "".$memberList[$evaluator].""; - $comment = array_pop($row); - foreach ($row as $num => $grade) { - echo '"; - } - echo ""; - //General Comment - echo ""; - $col = $rubric['Rubric']['criteria'] + 1; - echo ""; - } - } ?> -

    '; - //Points Detail - echo "".__('Points', true).": "; - $lom = $grade["grade"]; - $empty = $rubric["Rubric"]["lom_max"]; - for ($v = 0; $v < $lom; $v++) { - echo $html->image('evaluations/circle.gif', array('align'=>'middle', 'vspace'=>'1', 'hspace'=>'1','alt'=>'circle')); - $empty--; - } - for ($t=0; $t < $empty; $t++) { - echo $html->image('evaluations/circle_empty.gif', array('align'=>'middle', 'vspace'=>'1', 'hspace'=>'1','alt'=>'circle_empty')); - } - echo "
    "; - //Grade Detail - echo "".__('Grade:', true)." "; - echo $grade["grade"] . " / " . $multiplier[$num] . "
    "; - //Comments - echo "
    ".__('Comment:', true)." "; - echo $grade["comment"]; - echo "
    ".__('General Comment:', true)."
    "; - echo $comment; - echo "

    - "; - //Grade Released - if (isset($scoreRecords[$userId]['gradeRelease']) && $scoreRecords[$userId]['gradeRelease']) {?> - - - - - - - - - - - - "; - echo "
    ".__("Auto Release is ON, you do not need to manually release the grades and comments", true); - echo "
    "; - } ?> + $headers = $this->Evaluation->getIndividualRubricHeader($rubric['RubricsCriteria']); + $params = array( + 'evaluatee' => $userId, + 'multiplier' => $multiplier, + 'headers' => $headers, + 'result' => $scoreRecords[$userId]['individual'], + 'notInGroup' => Set::extract($notInGroup, '/User/id'), + 'memberList' => $memberList, + 'rubric' => $rubric['Rubric'], + ); + echo $this->element('evaluations/rubric_details', $params); + ?>
    +
    +

    + + + + + + + +

    +

    From 5d06f8d6cd8e85fc1cc202f242434831947c84e2 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Mon, 31 Mar 2014 13:14:58 -0700 Subject: [PATCH 74/91] modified student view of rubric evaluation results The student view of the results for rubric per evaluations has been modified to reflect the individual releases of comments that were made possible on the instructor's view of the same results. To make the view more readable: - I have made the grades (including titles) not visible if they are not released. Reason behind this decision is if we couple that with some comments being unrelease, we will have a long list of "n/a", which discourages students to read the results. - I have also made the student view of their own evaluation grades/comments for their team members to be visible whether the grades or comments have been released or not. This is the same behaviour from before. - consequently, comments are not filtered in this section, I'm assuming the student knows what they wrote (whether it is good or bad) --- app/controllers/components/evaluation.php | 1 + app/controllers/evaluations_controller.php | 30 +++------------ app/models/evaluation_rubric.php | 21 ++++++++-- .../student_view_rubric_details.ctp | 38 ++++++++++--------- ...student_view_rubric_evaluation_results.ctp | 3 +- 5 files changed, 46 insertions(+), 47 deletions(-) diff --git a/app/controllers/components/evaluation.php b/app/controllers/components/evaluation.php index ae37ec9ae..c65a8623b 100644 --- a/app/controllers/components/evaluation.php +++ b/app/controllers/components/evaluation.php @@ -979,6 +979,7 @@ function changeRubricEvalCommentRelease($status, $grp_event_id, $evaluatee = nul function markRubricEvalReviewed($eventId, $grpEventId) { $this->EvaluationRubric = ClassRegistry::init('EvaluationRubric'); + $this->GroupEvent = ClassRegistry::init('GroupEvent'); $this->Event = ClassRegistry::init('Event'); // set group event to reviewed if all evaluatees' release status has been modified diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index 12a1bd3e6..b9a8a2600 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -1386,8 +1386,10 @@ function studentViewEvaluationResult($eventId, $groupId = null, $studentId = nul $fullNames = $this->User->getFullNames($userIds); $sub = $this->EvaluationSubmission->getEvalSubmissionByGrpEventIdSubmitter($groupEventId, $userId); $penalty = empty($sub) ? $this->Penalty->getPenaltyPercent($event) : $this->Penalty->getPenaltyPercent($sub); + $generalCommentRelease = array_sum(Set::extract($evaluateeDetails, '/EvaluationRubric/comment_release')); + $detailedCommentRelease = array_sum(Set::extract($evaluateeDetails, '/EvaluationRubricDetail/comment_release')); $status = array( - 'comment' => array_product(Set::extract($evaluateeDetails, '/EvaluationRubric/comment_release')), + 'comment' => ($generalCommentRelease + $detailedCommentRelease), 'grade' => array_product(Set::extract($evaluateeDetails, '/EvaluationRubric/grade_release')), 'autoRelease' => $autoRelease ); @@ -1670,7 +1672,7 @@ function changeAllCommentRelease ($param=null) $this->EvaluationSimple->setAllEventCommentRelease($eventId, $releaseStatus); break; case 2://rubric - $this->EvaluationRubric->setAllEventCommentRelease($eventId, $releaseStatus); + $this->EvaluationRubric->setAllEventCommentRelease($eventId, $this->Auth->user('id'), $releaseStatus); break; case 4://mix $this->EvaluationMixeval->setAllEventCommentRelease($eventId, $releaseStatus); @@ -1679,30 +1681,10 @@ function changeAllCommentRelease ($param=null) break; } - //Update all groupEvent's comment release Status based on submission + //Update all groupEvent's comment release status $groupEventList = $this->GroupEvent->getGroupListByEventId($eventId); foreach ($groupEventList as $groupEvent) { - $this->GroupEvent->id = $groupEvent['GroupEvent']['group_id']; - - //Get the total number of members who has completed this evaluation - $numOfCompletedCount = $this->EvaluationSubmission->numCountInGroupCompleted($groupEvent['GroupEvent']['id']); - //$numMembers = $this->GroupsMembers->find(count, 'group_id='.$groupEvent['GroupEvent']['group_id']); - $numMembers = $this->GroupsMembers->find('count', array('conditions' => array('group_id' => $groupEvent['GroupEvent']['group_id']))); - - if (($numOfCompletedCount != 0) && ($numOfCompletedCount < $numMembers)) { - $completeStatus = 'Some'; - } elseif ($releaseStatus && ($numOfCompletedCount == $numMembers)) { - $completeStatus = 'All'; - } else { - $completeStatus = 'None'; - } - - if ($releaseStatus == 0) { - $groupEvent['GroupEvent']['comment_release_status'] = 'None'; - } else { - $groupEvent['GroupEvent']['comment_release_status'] = $completeStatus; - } - $this->GroupEvent->save($groupEvent); + $this->Evaluation->markRubricEvalReviewed($eventId, $groupEvent['GroupEvent']['id']); } $this->redirect('/evaluations/view/'.$eventId); } diff --git a/app/models/evaluation_rubric.php b/app/models/evaluation_rubric.php index eeaf82f3c..ee666164d 100644 --- a/app/models/evaluation_rubric.php +++ b/app/models/evaluation_rubric.php @@ -339,16 +339,29 @@ function getTeamReleaseStatus($groupEventId) * setAllEventCommentRelease * * @param bool $eventId event id + * @param mixed $userId user id * @param bool $releaseStatus release status * * @access public * @return void */ - function setAllEventCommentRelease($eventId, $releaseStatus) + function setAllEventCommentRelease($eventId, $userId, $releaseStatus) { - $fields = array('EvaluationRubric.comment_release' => $releaseStatus); - $conditions = array('EvaluationRubric.event_id' => $eventId); - return $this->updateAll($fields, $conditions); + $this->EvaluationRubricDetail = ClassRegistry::init('EvaluationRubricDetail'); + + $now = '"'.date("Y-m-d H:i:s").'"'; + + $conditions = array('event_id' => $eventId); + $evalRubrIds = $this->find('list', array('conditions' => $conditions)); + // update all comment release status that meets the conditions + $this->updateAll( + array('EvaluationRubric.comment_release' => $releaseStatus, 'EvaluationRubric.modified' => $now, 'EvaluationRubric.updater_id' => $userId), + array('EvaluationRubric.id' => $evalRubrIds) + ); + $this->EvaluationRubricDetail->updateAll( + array('EvaluationRubricDetail.comment_release' => $releaseStatus, 'EvaluationRubricDetail.modified' => $now, 'EvaluationRubricDetail.updater_id' => $userId), + array('EvaluationRubricDetail.evaluation_rubric_id' => $evalRubrIds) + ); } diff --git a/app/views/elements/evaluations/student_view_rubric_details.ctp b/app/views/elements/evaluations/student_view_rubric_details.ctp index 389bb0fea..2762a2280 100644 --- a/app/views/elements/evaluations/student_view_rubric_details.ctp +++ b/app/views/elements/evaluations/student_view_rubric_details.ctp @@ -21,30 +21,32 @@ $commentReleased = $status['autoRelease'] || (isset($release)? $release['comment $memberRubric = $row['EvaluationRubric']; ?> -
    + - : - image('evaluations/circle.gif', array('align'=>'middle', 'vspace'=>'1', 'hspace'=>'1','alt'=>'circle')); + +
    : + image('evaluations/circle.gif', array('align'=>'middle', 'vspace'=>'1', 'hspace'=>'1','alt'=>'circle')); + } + for ($t=0; $t < $rubric["Rubric"]["lom_max"] - $detail["selected_lom"]; $t++) { + echo $html->image('evaluations/circle_empty.gif', array('align'=>'middle', 'vspace'=>'1', 'hspace'=>'1','alt'=>'circle_empty')); + } + } else { + echo __('n/a', true); } - for ($t=0; $t < $rubric["Rubric"]["lom_max"] - $detail["selected_lom"]; $t++) { - echo $html->image('evaluations/circle_empty.gif', array('align'=>'middle', 'vspace'=>'1', 'hspace'=>'1','alt'=>'circle_empty')); + //Grade Detail + echo "
    Grade: "; + if ($gradeReleased && isset($detail)) { + echo $detail["grade"]; + } else { + echo __('n/a', true); } - } else { - echo __('n/a', true); - } - //Grade Detail - echo "
    Grade: "; - if ($gradeReleased && isset($detail)) { - echo $detail["grade"]; - } else { - echo __('n/a', true); } //Comments ?>
    : - + @@ -54,7 +56,7 @@ $commentReleased = $status['autoRelease'] || (isset($release)? $release['comment :
    -

    +

    diff --git a/app/views/evaluations/student_view_rubric_evaluation_results.ctp b/app/views/evaluations/student_view_rubric_evaluation_results.ctp index d1039f982..fe77dea4e 100644 --- a/app/views/evaluations/student_view_rubric_evaluation_results.ctp +++ b/app/views/evaluations/student_view_rubric_evaluation_results.ctp @@ -71,7 +71,8 @@
    'evaluations', 'rubric'=>$rubric, 'membersList'=>$membersList, 'details'=>$evaluatorDetails, 'penalty'=>$penalty); + $status['review'] = 1; // for student to review evaluations they gave others + $params = array('controller'=>'evaluations', 'rubric'=>$rubric, 'membersList'=>$membersList, 'details'=>$evaluatorDetails, 'penalty'=>$penalty, 'status'=>$status); echo $this->element('evaluations/student_view_rubric_details', $params); ?>
    From 8619f6fe55dc1b83ce21fa8068a9748ef3ea7401 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Thu, 3 Apr 2014 11:09:40 -0700 Subject: [PATCH 75/91] made modifications to the functionality of releasing indiv comments - only displaying buttons to release comments and grades after the event has closed - chagned release all comments/grades to only change release status of evaluation rubric entries that are not "reviewed" - updated controller and model tests to reflect the changes made to some of the functions for the releasing individual comments feature. --- app/controllers/evaluations_controller.php | 7 +++++++ app/controllers/events_controller.php | 16 +++++++++++++++- app/models/evaluation_rubric.php | 18 +++++++++++++++--- .../controllers/events_controller.test.php | 1 + .../cases/models/evaluation_rubric.test.php | 4 ++-- .../elements/evaluations/rubric_details.ctp | 2 ++ app/views/evaluations/view.ctp | 4 +++- .../view_rubric_evaluation_results_detail.ctp | 3 +++ 8 files changed, 48 insertions(+), 7 deletions(-) diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index b9a8a2600..90e661605 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -201,11 +201,15 @@ function view($eventId = null) // Set up the basic static ajax list variables $this->setUpAjaxList($eventId); + + // set status whether instructors can view un/release comments & grades + $viewReleaseBtns = time() >= strtotime($event['Event']['release_date_end']); // Set the display list $this->set('paramsForList', $this->AjaxList->getParamsForList()); $this->set('data', $event); + $this->set('viewReleaseBtns', $viewReleaseBtns); $this->set('breadcrumb', $this->breadcrumb->push(array('course' => $event['Course'])) ->push(array('event' => $event['Event'])) ->push(__('Results', true))); @@ -1186,6 +1190,9 @@ function viewEvaluationResults($eventId, $groupId = null, $displayFormat="") ->push(array('event' => $event['Event'])) ->push(__('Results', true))); + // set status whether instructors can view un/release comments & grades + $viewReleaseBtns = time() >= strtotime($event['Event']['release_date_end']); + $this->set('viewReleaseBtns', $viewReleaseBtns); switch ($event['Event']['event_template_type_id']) { diff --git a/app/controllers/events_controller.php b/app/controllers/events_controller.php index e350acf35..caf2a0f83 100644 --- a/app/controllers/events_controller.php +++ b/app/controllers/events_controller.php @@ -14,7 +14,7 @@ class EventsController extends AppController public $helpers = array('Html', 'Ajax', 'Javascript', 'Time'); public $uses = array('GroupEvent', 'User', 'Group', 'Course', 'Event', 'EventTemplateType', 'SimpleEvaluation', 'Rubric', 'Mixeval', 'Personalize', 'GroupsMembers', 'Penalty', 'Survey','EmailSchedule', - 'EvaluationSubmission', 'EmailTemplate'); + 'EvaluationSubmission', 'EmailTemplate', 'EvaluationRubric'); public $components = array("AjaxList", "Session", "RequestHandler","Email"); /** @@ -505,6 +505,20 @@ function edit($eventId) if (empty($this->data['Group']['Group'])) { $this->GroupEvent->deleteAll(array('GroupEvent.event_id' => $eventId)); } + + /* update submitted evaluations release status if: + 1. after the event has closed AND + 2. auto-release status has been changed + */ + if (time() >= strtotime($event['Event']['release_date_end']) && + $this->data['Event']['auto_release'] != $event['Event']['auto_release']) { + switch ($event['Event']['event_template_type_id']) { + case 2://rubric + $this->EvaluationRubric->setAllEventCommentRelease($eventId, User::get('id'), $this->data['Event']['auto_release']); + $this->EvaluationRubric->setAllEventGradeRelease($eventId, $this->data['Event']['auto_release']); + break; + } + } $penaltyData = $this->Penalty->find('all', array('conditions' => array('event_id' => $eventId), 'contain' => false)); $penalties = array(); diff --git a/app/models/evaluation_rubric.php b/app/models/evaluation_rubric.php index ee666164d..33ab72ba8 100644 --- a/app/models/evaluation_rubric.php +++ b/app/models/evaluation_rubric.php @@ -348,10 +348,15 @@ function getTeamReleaseStatus($groupEventId) function setAllEventCommentRelease($eventId, $userId, $releaseStatus) { $this->EvaluationRubricDetail = ClassRegistry::init('EvaluationRubricDetail'); + $this->GroupEvent = ClassRegistry::init('GroupEvent'); $now = '"'.date("Y-m-d H:i:s").'"'; - $conditions = array('event_id' => $eventId); + // only change release status if the group event is NOT marked as reviewed + $grpEvents = $this->GroupEvent->find('list', array( + 'conditions' => array('event_id' => $eventId, 'marked' => 'not reviewed') + )); + $conditions = array('grp_event_id' => $grpEvents); $evalRubrIds = $this->find('list', array('conditions' => $conditions)); // update all comment release status that meets the conditions $this->updateAll( @@ -374,10 +379,17 @@ function setAllEventCommentRelease($eventId, $userId, $releaseStatus) * @access public * @return void */ - function setAllEventGradeRelease($eventId=null, $releaseStatus=null) + function setAllEventGradeRelease($eventId, $releaseStatus) { + $this->GroupEvent = ClassRegistry::init('GroupEvent'); + + // only change release status if the group event is NOT marked as reviewed + $grpEvents = $this->GroupEvent->find('list', array( + 'conditions' => array('event_id' => $eventId, 'marked' => 'not reviewed') + )); + $fields = array('EvaluationRubric.grade_release' => $releaseStatus); - $conditions = array('EvaluationRubric.event_id' => $eventId); + $conditions = array('EvaluationRubric.grp_event_id' => $grpEvents); return $this->updateAll($fields, $conditions); } diff --git a/app/tests/cases/controllers/events_controller.test.php b/app/tests/cases/controllers/events_controller.test.php index 7624bf3ef..dd8f86702 100644 --- a/app/tests/cases/controllers/events_controller.test.php +++ b/app/tests/cases/controllers/events_controller.test.php @@ -277,6 +277,7 @@ function testEditWithData() { 'self_eval' => 0, 'com_req' => 0, 'enable_details' => 0, + 'auto_release' => 0, 'due_date' => '2012-11-28 00:00:01', 'release_date_begin' => '2012-11-20 00:00:01', 'release_date_end' => '2012-11-29 00:00:01', diff --git a/app/tests/cases/models/evaluation_rubric.test.php b/app/tests/cases/models/evaluation_rubric.test.php index f328417fd..ad97320e7 100644 --- a/app/tests/cases/models/evaluation_rubric.test.php +++ b/app/tests/cases/models/evaluation_rubric.test.php @@ -204,11 +204,11 @@ function testGetTeamReleaseStatus() function testSetAllEventCommentRelease() { - $this->EvaluationRubric->setAllEventCommentRelease(2, 1); + $this->EvaluationRubric->setAllEventCommentRelease(2, 1, 1); $result = $this->EvaluationRubric->getTeamReleaseStatus(3); $this->assertEqual($result[1]['EvaluationRubric']['comment_release'], 1); - $this->EvaluationRubric->setAllEventCommentRelease(999, 1); + $this->EvaluationRubric->setAllEventCommentRelease(999, 1, 1); $result = $this->EvaluationRubric->getTeamReleaseStatus(999); $this->assertFalse($result); } diff --git a/app/views/elements/evaluations/rubric_details.ctp b/app/views/elements/evaluations/rubric_details.ctp index 9b2d6f9d7..a1f787baa 100644 --- a/app/views/elements/evaluations/rubric_details.ctp +++ b/app/views/elements/evaluations/rubric_details.ctp @@ -59,7 +59,9 @@ foreach ($result AS $evaluator => $row) { } ?> + + \ No newline at end of file diff --git a/app/views/evaluations/view.ctp b/app/views/evaluations/view.ctp index 829e9f86a..18ebc3118 100644 --- a/app/views/evaluations/view.ctp +++ b/app/views/evaluations/view.ctp @@ -9,7 +9,7 @@ $eventId = $data['Event']['id'];?> - "; echo "
    ".__("Auto Release is ON, you do not need to manually release the grades and comments", true); echo ""; @@ -17,10 +17,12 @@ $eventId = $data['Event']['id'];?>
    • link(__(" Export Evaluations", true), "export/event/".$eventId, array('class' => 'export-excel-button'));?>
    • +
    • link(__('Release All Comments', true), 'changeAllCommentRelease/'.$eventId.';1', array('class' => 'button'));?>
    • link(__('Unrelease All Comments', true), 'changeAllCommentRelease/'.$eventId.';0', array('class' => 'button'));?>
    • link(__('Release All Grades', true), 'changeAllGradeRelease/'.$eventId.';1',array('class' => 'button'));?>
    • link(__('Unrelease All Grades', true),'changeAllGradeRelease/'.$eventId.';0',array('class' => 'button'));?>
    • +
    diff --git a/app/views/evaluations/view_rubric_evaluation_results_detail.ctp b/app/views/evaluations/view_rubric_evaluation_results_detail.ctp index 5e714a37c..fa2dca486 100644 --- a/app/views/evaluations/view_rubric_evaluation_results_detail.ctp +++ b/app/views/evaluations/view_rubric_evaluation_results_detail.ctp @@ -115,6 +115,7 @@ if (!empty($notInGroup)) { 'notInGroup' => Set::extract($notInGroup, '/User/id'), 'memberList' => $memberList, 'rubric' => $rubric['Rubric'], + 'viewReleaseBtns' => $viewReleaseBtns, ); echo $this->element('evaluations/rubric_details', $params); ?> @@ -128,10 +129,12 @@ if (!empty($notInGroup)) { + +

    From 6d63c2bf53bb7c72697d12b6e84ef67e122ad5f7 Mon Sep 17 00:00:00 2001 From: Michael Tang Date: Fri, 4 Apr 2014 15:24:35 -0700 Subject: [PATCH 76/91] individual comment un/release for mixed evaluation has been implemented Instructors can now: - "save changes" and release individual comments - un/release all comments for an individual evaluatee - un/release all comments for all members in a group - un/release all comments for an event --- app/controllers/components/evaluation.php | 156 ++++++++++-------- app/controllers/evaluations_controller.php | 41 +++-- app/models/evaluation_mixeval.php | 39 +++-- .../components/evaluation_component.test.php | 53 ------ .../elements/evaluations/mixeval_details.ctp | 28 +++- ...tudent_view_mixeval_evaluation_results.ctp | 4 +- ...view_mixeval_evaluation_results_detail.ctp | 36 ++-- app/webroot/css/ipeer.css | 6 + 8 files changed, 191 insertions(+), 172 deletions(-) diff --git a/app/controllers/components/evaluation.php b/app/controllers/components/evaluation.php index c65a8623b..161ae117a 100644 --- a/app/controllers/components/evaluation.php +++ b/app/controllers/components/evaluation.php @@ -845,43 +845,6 @@ function changeRubricEvaluationGradeRelease ($groupEventId, $evaluateeId, $relea $this->GroupEvent->read(), $releaseStatus, $oppositGradeReleaseCount); $this->GroupEvent->save($groupEvent); } - - - /** - * changeRubricEvaluationCommentRelease - DEPRECATED - * - * @param mixed $groupEventId group event id - * @param mixed $evaluateeId evaluatee id - * @param mixed $params params - * - * @access public - * @return void - */ - function changeRubricEvaluationCommentRelease ($groupEventId, $evaluateeId, $params) - { - $this->EvaluationRubric = ClassRegistry::init('EvaluationRubric'); - $this->GroupEvent = ClassRegistry::init('GroupEvent'); - $this->GroupEvent->id = $groupEventId; - $groupEvent = $this->GroupEvent->read(); - - //changing comment release for each EvaluationRubric - $evaluationRubric = $this->EvaluationRubric->getResultsByEvaluatee($groupEventId, $evaluateeId); - foreach ($evaluationRubric as $row) { - $evalRubric = $row['EvaluationRubric']; - if (isset($evalRubric)) { - $this->EvaluationRubric->id = $evalRubric['id']; - $evalRubric['comment_release'] = $releaseStatus; - $this->EvaluationRubric->save($evalRubric); - } - } - - //changing comment release status for the GroupEvent - $this->GroupEvent->id = $groupEventId; - $oppositGradeReleaseCount = $this->EvaluationRubric->getOppositeCommentReleaseStatus($groupEventId, $releaseStatus); - $groupEvent = $this->formatCommentReleaseStatus( - $this->GroupEvent->read(), $releaseStatus, $oppositGradeReleaseCount); - $this->GroupEvent->save($groupEvent); - } /** * changeIndivRubricEvalCommentRelease @@ -895,8 +858,6 @@ function changeIndivRubricEvalCommentRelease($params) { $this->EvaluationRubric = ClassRegistry::init('EvaluationRubric'); $this->EvaluationRubricDetail = ClassRegistry::init('EvaluationRubricDetail'); - $this->GroupEvent = ClassRegistry::init('GroupEvent'); - $this->Event = ClassRegistry::init('Event'); $grpEventId = $params['group_event_id']; $evaluatee = $params['evaluatee']; @@ -945,7 +906,6 @@ function changeRubricEvalCommentRelease($status, $grp_event_id, $evaluatee = nul { $this->EvaluationRubric = ClassRegistry::init('EvaluationRubric'); $this->EvaluationRubricDetail = ClassRegistry::init('EvaluationRubricDetail'); - $this->GroupEvent = ClassRegistry::init('GroupEvent'); $now = '"'.date("Y-m-d H:i:s").'"'; $user = $this->Auth->user('id'); @@ -1288,48 +1248,102 @@ function changeMixevalEvaluationGradeRelease ($groupEventId, $evaluateeId, $rele $this->GroupEvent->read(), $releaseStatus, $oppositGradeReleaseCount); $this->GroupEvent->save($groupEvent); } + + /** + * changeIndivMixedEvalCommentRelease + * + * @param mixed $params + * + * @access public + * @return void + */ + function changeIndivMixedEvalCommentRelease($params) + { + $this->EvaluationMixevalDetail = ClassRegistry::init('EvaluationMixevalDetail'); + $this->EvaluationMixeval = ClassRegistry::init('EvaluationMixeval'); + + $grpEventId = $params['group_event_id']; + $evaluatee = $params['evaluatee']; + + $now = '"'.date("Y-m-d H:i:s").'"'; + $user = $this->Auth->user('id'); + + $mixedIds = $this->EvaluationMixeval->find('list', array( + 'conditions' => array('evaluatee' => $evaluatee, 'grp_event_id' => $grpEventId) + )); + // change comment release to 0 for the evaluatee in this group event + $this->EvaluationMixevalDetail->updateAll( + array('EvaluationMixevalDetail.comment_release' => 0, 'EvaluationMixevalDetail.modified' => $now, 'EvaluationMixevalDetail.updater_id' => $user), + array('EvaluationMixevalDetail.evaluation_mixeval_id' => $mixedIds) + ); + + //release general comments + $mixedDetailIds = isset($params['releaseComments']) ? $params['releaseComments'] : array(); + $this->EvaluationMixevalDetail->updateAll( + array('EvaluationMixevalDetail.comment_release' => 1, 'EvaluationMixevalDetail.modified' => $now, 'EvaluationMixevalDetail.updater_id' => $user), + array('EvaluationMixevalDetail.id' => $mixedDetailIds) + ); + } + + /** + * changeMixedEvalCommentRelease + * + * @param mixed $status status + * @param mixed $grpEventId group event id + * @param mixed $evaluatee evaluatee + * + * @access public + * @return void + */ + function changeMixedEvalCommentRelease($status, $grp_event_id, $evaluatee = null) + { + $this->EvaluationMixeval = ClassRegistry::init('EvaluationMixeval'); + $this->EvaluationMixevalDetail = ClassRegistry::init('EvaluationMixevalDetail'); + $now = '"'.date("Y-m-d H:i:s").'"'; + $user = $this->Auth->user('id'); + + $conditions = array('grp_event_id' => $grp_event_id); + if ($evaluatee) { + $conditions['evaluatee'] = $evaluatee; + } + + $evalRubrIds = $this->EvaluationMixeval->find('list', array('conditions' => $conditions)); + // update all comment release status that meets the conditions + $this->EvaluationMixevalDetail->updateAll( + array('EvaluationMixevalDetail.comment_release' => $status, 'EvaluationMixevalDetail.modified' => $now, 'EvaluationMixevalDetail.updater_id' => $user), + array('EvaluationMixevalDetail.evaluation_mixeval_id' => $evalRubrIds) + ); + } /** - * changeMixevalEvaluationCommentRelease + * markMixedEvalReviewed * - * @param mixed $groupEventId group event id - * @param mixed $evaluateeId evaluatee id - * @param mixed $releaseStatus release status + * @param mixed $eventId + * @param mixed $grpEventId * * @access public * @return void */ - function changeMixevalEvaluationCommentRelease ($groupEventId, $evaluateeId, $releaseStatus) + function markMixedEvalReviewed($eventId, $grpEventId) { - $this->EvaluationMixeval = ClassRegistry::init('EvaluationMixeval'); + $this->EvaluationMixevalDetail = ClassRegistry::init('EvaluationMixevalDetail'); $this->GroupEvent = ClassRegistry::init('GroupEvent'); - $this->EvaluationSubmission = ClassRegistry::init('EvaluationSubmission'); - - $this->GroupEvent->id = $groupEventId; - $groupEvent = $this->GroupEvent->read(); - - $sub = $this->EvaluationSubmission->findAllByGrpEventId($groupEventId); - $sub = Set::extract('/EvaluationSubmission/submitter_id', $sub); - - //changing comment release for each EvaluationMixeval - $evaluationMixeval = $this->EvaluationMixeval->getResultsByEvaluatee($groupEventId, $evaluateeId, $sub); - foreach ($evaluationMixeval as $row) { - $evalMixeval = $row['EvaluationMixeval']; - if (isset($evalMixeval)) { - $this->EvaluationMixeval->id = $evalMixeval['id']; - $evalMixeval['comment_release'] = $releaseStatus; - $this->EvaluationMixeval->save($evalMixeval);; - } + $this->Event = ClassRegistry::init('Event'); + + // set group event to reviewed if all evaluatees' release status has been modified + $eval = $this->EvaluationMixevalDetail->find('first', array( + 'conditions' => array('grp_event_id' => $grpEventId), + 'order' => array('EvaluationMixevalDetail.modified ASC') + )); + $event = $this->Event->findById($eventId); + + // if the oldest modified date is after the event's close date + if (strtotime($event['Event']['release_date_end']) <= strtotime($eval['EvaluationMixevalDetail']['modified'])) { + // set group event to reviewed + $this->GroupEvent->id = $grpEventId; + $this->GroupEvent->saveField('marked', 'reviewed'); } - - //changing comment release status for the GroupEvent - $this->GroupEvent->id = $groupEventId; - $oppositGradeReleaseCount = $this->EvaluationMixeval->getOppositeCommentReleaseStatus($groupEventId, $releaseStatus); - $groupEvent = $this->formatCommentReleaseStatus($this->GroupEvent->read(), $releaseStatus, - $oppositGradeReleaseCount); - - $this->GroupEvent->save($groupEvent); } /** diff --git a/app/controllers/evaluations_controller.php b/app/controllers/evaluations_controller.php index 90e661605..a6487e0cc 100644 --- a/app/controllers/evaluations_controller.php +++ b/app/controllers/evaluations_controller.php @@ -1639,11 +1639,27 @@ function markCommentRelease($param = null) break; case "4": - $groupId = strtok(';'); - $evaluateeId = strtok(';'); - $groupEventId = strtok(';'); - $releaseStatus = strtok(';'); - $this->Evaluation->changeMixevalEvaluationCommentRelease($groupEventId, $evaluateeId, $releaseStatus); + $groupId = $this->params['form']['group_id']; + $evaluateeId = $this->params['form']['evaluatee']; + $groupEventId = $this->params['form']['group_event_id']; + switch($this->params['form']['submit']) { + case "Save Changes": + $this->Evaluation->changeIndivMixedEvalCommentRelease($this->params['form']); + break; + case "Release All Comments": + $this->Evaluation->changeMixedEvalCommentRelease(1, $groupEventId, $evaluateeId); + break; + case "Unrelease All Comments": + $this->Evaluation->changeMixedEvalCommentRelease(0, $groupEventId, $evaluateeId); + break; + case "Release Comments": + $this->Evaluation->changeMixedEvalCommentRelease(1, $groupEventId); + break; + case "Unrelease Comments": + $this->Evaluation->changeMixedEvalcommentRelease(0, $groupEventId); + break; + } + $this->Evaluation->markMixedEvalReviewed($eventId, $groupEventId); $this->redirect('viewEvaluationResults/'.$eventId.'/'.$groupId.'/Detail'); break; } @@ -1674,25 +1690,28 @@ function changeAllCommentRelease ($param=null) $this->Event->id = $eventId; $event = $this->Event->read(); + $groupEventList = $this->GroupEvent->getGroupListByEventId($eventId); switch ($event['Event']['event_template_type_id']) { case 1://simple $this->EvaluationSimple->setAllEventCommentRelease($eventId, $releaseStatus); break; case 2://rubric $this->EvaluationRubric->setAllEventCommentRelease($eventId, $this->Auth->user('id'), $releaseStatus); + //Update all groupEvent's comment release status + foreach ($groupEventList as $groupEvent) { + $this->Evaluation->markRubricEvalReviewed($eventId, $groupEvent['GroupEvent']['id']); + } break; case 4://mix - $this->EvaluationMixeval->setAllEventCommentRelease($eventId, $releaseStatus); + $this->EvaluationMixeval->setAllEventCommentRelease($eventId, $this->Auth->user('id'), $releaseStatus); + foreach ($groupEventList as $groupEvent) { + $this->Evaluation->markMixedEvalReviewed($eventId, $groupEvent['GroupEvent']['id']); + } break; default: break; } - //Update all groupEvent's comment release status - $groupEventList = $this->GroupEvent->getGroupListByEventId($eventId); - foreach ($groupEventList as $groupEvent) { - $this->Evaluation->markRubricEvalReviewed($eventId, $groupEvent['GroupEvent']['id']); - } $this->redirect('/evaluations/view/'.$eventId); } diff --git a/app/models/evaluation_mixeval.php b/app/models/evaluation_mixeval.php index 21d6cbb3f..2d050a650 100644 --- a/app/models/evaluation_mixeval.php +++ b/app/models/evaluation_mixeval.php @@ -322,18 +322,30 @@ function getTeamReleaseStatus($groupEventId=null) * setAllEventCommentRelease * * @param int $eventId event id + * @param mixed $userId user id * @param mixed $releaseStatus release status * * @access public * @return void */ - function setAllEventCommentRelease($eventId=null, $releaseStatus=null) - { - // $sql = 'UPDATE evaluation_mixevals SET comment_release = '.$releaseStatus.' WHERE event_id = '.$eventId; - // return $this->query($sql); - $fields = array('EvaluationMixeval.comment_release' => $releaseStatus); - $conditions = array('EvaluationMixeval.event_id' => $eventId); - return $this->updateAll($fields, $conditions); + function setAllEventCommentRelease($eventId, $userId, $releaseStatus) + { + $this->EvaluationMixevalDetail = ClassRegistry::init('EvaluationMixevalDetail'); + $this->GroupEvent = ClassRegistry::init('GroupEvent'); + + $now = '"'.date("Y-m-d H:i:s").'"'; + + // only change release status if the group event is NOT marked as reviewed + $grpEvents = $this->GroupEvent->find('list', array( + 'conditions' => array('event_id' => $eventId, 'marked' => 'not reviewed') + )); + $conditions = array('grp_event_id' => $grpEvents); + $detailIds = $this->find('list', array('conditions' => $conditions)); + // update all comment release status that meets the conditions + $this->EvaluationMixevalDetail->updateAll( + array('EvaluationMixevalDetail.comment_release' => $releaseStatus, 'EvaluationMixevalDetail.modified' => $now, 'EvaluationMixevalDetail.updater_id' => $userId), + array('EvaluationMixevalDetail.evaluation_mixeval_id' => $detailIds) + ); } @@ -346,12 +358,17 @@ function setAllEventCommentRelease($eventId=null, $releaseStatus=null) * @access public * @return void */ - function setAllEventGradeRelease($eventId=null, $releaseStatus=null) + function setAllEventGradeRelease($eventId, $releaseStatus) { - // $sql = 'UPDATE evaluation_mixevals SET grade_release = '.$releaseStatus.' WHERE event_id = '.$eventId; - // return $this->query($sql); + $this->GroupEvent = ClassRegistry::init('GroupEvent'); + + // only change release status if the group event is NOT marked as reviewed + $grpEvents = $this->GroupEvent->find('list', array( + 'conditions' => array('event_id' => $eventId, 'marked' => 'not reviewed') + )); + $fields = array('EvaluationMixeval.grade_release' => $releaseStatus); - $conditions = array('EvaluationMixeval.event_id' => $eventId); + $conditions = array('EvaluationMixeval.grp_event_id' => $grpEvents); return $this->updateAll($fields, $conditions); } diff --git a/app/tests/cases/components/evaluation_component.test.php b/app/tests/cases/components/evaluation_component.test.php index ae9b9a5f1..3af9e110b 100644 --- a/app/tests/cases/components/evaluation_component.test.php +++ b/app/tests/cases/components/evaluation_component.test.php @@ -382,50 +382,6 @@ function testChangeRubricEvaluationGradeRelease() } } - /** - * testChangeRubricEvaluationCommentRelease - * - * Tests method to see if comment release can be changed for a single user - * and for all users for the event. - */ - function testChangeRubricEvaluationCommentRelease() - { - // Test case for making comment unreleased (releaseStatus = 0) - // Tests change for single user in event - $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(4, 33, 0); - $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4, 'evaluatee' => 33))); - $this->assertEqual($result[0]['EvaluationRubric']['comment_release'], 0); - - // Test case for making comment released (releaseStatus = 1) - // Tests change for single user in event - $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(4, 32, 1); - $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4, 'evaluatee' => 32))); - $this->assertEqual($result[0]['EvaluationRubric']['comment_release'], 1); - - // Test case for making comment unreleased (releaseStatus = 0) - // Tests change for all users in event - $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(4, null, 0); - $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4))); - foreach ($result as $row) { - $this->assertEqual($row['EvaluationRubric']['comment_release'], 0); - } - - // Test case for making comment released (releaseStatus = 1) - // Tests change for all users in event - $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(4, null, 1); - $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => 4))); - foreach ($result as $row) { - $this->assertEqual($row['EvaluationRubric']['comment_release'], 1); - } - - // Test case for null event - $this->EvaluationComponentTest->changeRubricEvaluationCommentRelease(null, null, 1); - $result = $this->EvaluationRubric->find('all', array('conditions' => array('grp_event_id' => null))); - foreach ($result as $row) { - $this->assertNull($row['EvaluationRubric']['comment_release']); - } - } - //TODO //Skip, uses Auth function testFormatRubricEvaluationResult() @@ -597,15 +553,6 @@ function testChangeMixevalEvaluationGradeRelease() - } - - function testChangeMixevalEvaluationCommentRelease() - { - - $this->EvaluationComponentTest->changeMixevalEvaluationCommentRelease(1, 1, 1); - // $survey = $this->EvaluationMixeval->find('all', array('conditions' => array('grp_event_id' => 1))); - // var_dump($survey); - } //function is not used anywhere diff --git a/app/views/elements/evaluations/mixeval_details.ctp b/app/views/elements/evaluations/mixeval_details.ctp index 0037b3743..160a0fc01 100644 --- a/app/views/elements/evaluations/mixeval_details.ctp +++ b/app/views/elements/evaluations/mixeval_details.ctp @@ -9,9 +9,17 @@ if (!$gradeReleased && !$commentReleased && $details) { } $header = $title.$addOn; +echo "
    "; echo $html->tag('h2', $header); $qnum = 1; if ($details) { + if ($instructorMode && $viewReleaseBtns) { ?> +
    + + + + + '.$name.$sub['grade'].''; } else { - echo '
  • '.$name.$sub['question_comment'].'
  • '; + $chkParam = array( + 'value' => $sub['id'], + 'hiddenField' => false, + 'name' => 'releaseComments[]', + 'checked' => $sub['comment_release'], + ); + $comment = ($instructorMode || $sub['comment_release']) ? $sub['question_comment'] : __('n/a', true); + $check = $instructorMode ? $form->checkbox($chkParam['name'], $chkParam) : ''; + echo '
  • '.$name.$check.$comment.'
  • '; } } echo ''; @@ -68,6 +84,15 @@ if ($details) { } $qnum++; } + echo "
    "; + if ($instructorMode && $viewReleaseBtns) {?> + + + + + + '; + } echo '
    '; } else { foreach ($questions as $qnum => $ques) { @@ -95,3 +120,4 @@ if ($details) { echo '
    '; } ?> +
    \ No newline at end of file diff --git a/app/views/evaluations/student_view_mixeval_evaluation_results.ctp b/app/views/evaluations/student_view_mixeval_evaluation_results.ctp index 111195dff..95362e663 100644 --- a/app/views/evaluations/student_view_mixeval_evaluation_results.ctp +++ b/app/views/evaluations/student_view_mixeval_evaluation_results.ctp @@ -52,14 +52,14 @@ foreach ($evalResult[User::get('id')] as $eval) { if ($mixeval['Mixeval']['peer_question'] > 0) { $params = array('controller'=>'evaluations', 'questions'=>$questions, 'zero_mark'=>$zero_mark, 'evaluatee' => User::get('id'), 'gradeReleased'=>$gradeReleased, 'commentReleased'=>$commentReleased, 'details'=>$event['Event']['enable_details'], - 'peer_eval' => 1, 'title' => 'Questions'); + 'peer_eval' => 1, 'title' => __('Questions', true), 'instructorMode' => 0); echo $this->element('evaluations/mixeval_details', $params); } if ($mixeval['Mixeval']['self_eval'] > 0) { $params = array('controller'=>'evaluations', 'questions'=>$questions, 'zero_mark'=>$zero_mark, 'evaluatee' => User::get('id'), 'gradeReleased'=> 1, 'commentReleased'=> 1, 'details'=>$event['Event']['enable_details'], - 'peer_eval' => 0, 'title' => 'Self-Evaluation'); + 'peer_eval' => 0, 'title' => __('Self-Evaluation', true), 'instructorMode' => 0); echo $this->element('evaluations/mixeval_details', $params); } ?> diff --git a/app/views/evaluations/view_mixeval_evaluation_results_detail.ctp b/app/views/evaluations/view_mixeval_evaluation_results_detail.ctp index 8bbc9b1e6..8f6c7388a 100644 --- a/app/views/evaluations/view_mixeval_evaluation_results_detail.ctp +++ b/app/views/evaluations/view_mixeval_evaluation_results_detail.ctp @@ -133,7 +133,6 @@ if (!empty($notInGroup)) { echo $penaltyNotice; ?> -
    'evaluations', 'questions'=>$questions, 'zero_mark'=>$zero_mark, 'gradeReleased'=>1, 'commentReleased'=>1, 'details'=>1, 'evaluatee'=>$evaluteeId, - 'names'=>$memberList, 'notInGroup'=>$notInGroup, 'peer_eval' => 1, 'title' => 'Questions'); + 'names'=>$memberList, 'notInGroup'=>$notInGroup, 'peer_eval' => 1, 'title' => __('Questions', true), + 'instructorMode' => 1, 'event' => $event); echo $this->element('evaluations/mixeval_details', $params); ?> -
    - - - - - - - - - - "; echo "
    ".__("Auto Release is ON, you do not need to manually release the grades and comments", true); @@ -180,7 +160,17 @@ if (!empty($notInGroup)) {
    - + +

    + + + + + + + +

    +