data)) {
$data = $this->data;
} else if (!empty($username) and !empty($password)) {
$data = array('User' => array('username' => urldecode($username), 'password' => urldecode($password)));
}
if (!empty($data)) {
if ($user_id = $this->auth->attemptLogin($data)) {
//$error = 'Logged in!';
$this->redirect($this->pglms->defaultPage($user_id));
} else {
$error = $this->auth->error;
if (!$error) $error = 'Internal error.';
}
} else if (!empty($this->uid)) {
//$error = 'Already logged in!';
// Shouldn't happen, but does anyway.
$this->redirect($this->pglms->defaultPage($this->uid));
}
$this->auth->newSalt();
$this->set('error', $error);
$this->set('allowcleartext', $this->auth->allowCleartext);
$this->set('onload', "this.document.pForm['data[User][username]'].focus()");
$this->pageTitle = 'User Login';
}
function token() {
// Takes various parameters, to generate a single-signon token url:
// 'u': Client-side user uid
// 'c': Section identifier
// 'p': School identifier
// 'f': User first name
// 'l': User last name
// 'e': User email address
// 'r': User role
// 'i': Course identifier
// Also looks at server-side variables to find the school id:
// 'PG_SSO-SystemID': eCollege identifier
// 'PG_SSO-MAC': Message Authentication Code
// 'PG_SSO-Timestamp': ISO8601-format timestamp
// Possible error codes returned:
// 100: Unknown error
// 101: Missing a required parameter
// 102: Unauthorized access (a header was missing or wrong)
// 103: Unable to create user
// 104: Invalid parameter value
// 105: Invalid timestamp
// 106: Unsupported language course
// 107: Unknown school
// 108: Invalid section
$params = $this->params['url'];
$messages = array();
$param_vars = array(
'u' => 'user_uid', // user
'c' => 'section_uid', // section
'p' => 'school_uid', // school
//'s' => 'user_school',
'f' => 'first_name', // first
'l' => 'last_name', // last
'e' => 'email',
'r' => 'user_type', // role
'i' => 'course_uid', // course
'page' => 'next_page',
);
$header_vars = array(
'PG_SSO-SystemID' => 'system_school',
'PG_SSO-MAC' => 'message_hash',
'PG_SSO-Timestamp' => 'timestamp',
);
foreach ($param_vars as $key => $varname) {
$$varname = array_key_exists($key, $params)? $params[$key]: null;
}
foreach ($header_vars as $key => $varname) {
$ukey = 'HTTP_'.str_replace('-', '_', strtoupper($key));
if (empty($_SERVER[$ukey])) {
$messages[102] = 'Authentication headers not provided';
$$varname = 'Not provided';
} else {
$$varname = $_SERVER[$ukey];
}
}
if (!$messages) {
// Check the header variables
$this->User->School->useModel();
$system = $this->User->School->find(array('school_name' => $system_school), array('id', 'secret'));
if (empty($system['School']['id'])) {
$messages[102] = 'Unrecognized system identifier';
} else if (empty($system['School']['secret'])) {
// Make this the same as above, to prevent security breaches
//$messages[102] = 'Unknown shared secret.';
$messages[102] = 'Unrecognized system identifier';
} else if (strcmp($message_hash, $this->pglms->hmac($timestamp.$system['School']['secret'], $this->pglms->urn()))) {
$messages[102] = 'Incorrect message authentication code';
} else if (abs(time() - strtotime($timestamp)) > 300) {
// The request is more than five minutes old; assume that it has been spoofed.
// (However, it could be a simple case of a misconfigured server.)
// Alternatively, we could store all served requests, and refuse to serve them twice.
$messages[105] = 'Invalid timestamp';
} else if (empty($school_uid)) {
// Assume that we want the school for the system signon
$school_id = $system['School']['id'];
} else if (is_numeric($school_uid)) {
$children = $this->User->School->findChildrenIds($system['School']['id']);
if (in_array(intval($school_uid, $children))) {
$school_id = intval($school_uid);
} else {
$messages[107] = 'Invalid school id';
}
} else {
$fragments = explode('.', $school_uid);
if (count($fragments) > 1) foreach ($fragments as $portion) if ($portion) $school_uid = $portion;
$children = $this->User->School->findChildrenIds($system['School']['id']);
$school_id = $this->User->School->field('id', array('School.school_name' => $school_uid, 'School.id' => $children));
if (empty($school_id)) $messages[107] = 'Invalid school identifier';
}
}
if (!empty($school_id)) {
if ($first_name and $last_name and $user_type and $user_uid) {
$user_id = $this->User->autocreate($school_id, $user_type, $first_name, $last_name, $email, $user_uid)
or $messages[$this->User->errnum] = $this->User->error;
}
if ($section_uid and $course_uid) {
$uid_info = explode('.', $course_uid);
if (count($uid_info) > 1) {
$course_uid = $uid_info[0];
$segment = $uid_info[1];
$num_segments = (count($uid_info) > 2)? $uid_info[2]: 2;
} else {
$segment = $num_segments = 1;
}
$section_id = $this->User->Section->autocreate($school_id, $course_uid,
$segment, $num_segments, null, $section_uid, null, $system_school);
if (empty($section_id)) $messages[$this->User->Section->errnum] = $this->User->Section->error;
}
if (!empty($user_id) and !empty($section_id)) {
$joined = $this->User->autojoin($section_id, $user_id, $user_type)
or $messages[108] = 'Invalid section';
if ($joined and !$next_page) $next_page = '/sections/calendar/'.$section_id;
}
}
if (empty($joined)) {
if (empty($messages)) $messages[100] = 'Unknown Error';
$url = null;
} else {
$this->User->School->useModel();
$secret = $this->User->School->field('secret', array('id' => 1));
$token = time().'.'.$user_id;
$token .= '-'.sha1($token.'@'.$secret);
$url = $this->pglms->full_url('/users/signon/'.$token);
if (!empty($next_page)) $url .= '?page='.$next_page;
}
if (empty($url)) {
if (empty($school_id)) $school_id = empty($system['School']['id'])? 1: $system['School']['id'];
$subject = 'SSO Token Error';
$body = "The SSO token-creation process has failed.\n";
foreach ($messages as $errnum => $msg) {
$body .= "Error #$errnum: $msg\n";
}
$body .= "\nRequest headers:\n";
foreach ($header_vars as $key => $varname) {
$msg = $$varname;
$body .= "$key: $msg\n";
}
$body .= "\nRequest parameters:\n";
foreach ($param_vars as $key => $varname) {
$msg = is_null($$varname)? 'Not provided': $$varname;
$body .= "$varname ($key): $msg\n";
}
$urn = $this->pglms->urn();
$body .= "\nRequest URN:\n$urn\n$_SERVER[REQUEST_URI]\n";
$this->User->School->mail_techs($school_id, $subject, $body);
}
$this->set('messages', $messages);
$this->set('login_url', $url);
}
function signon($token) {
// Function for a single-signon login.
// The token should have been recently generated by our system.
$error = "Your system failed to log you in properly.
If it doesn't work in a few minutes, talk to your administrator.";
$info = explode('-', $token);
if (count($info) == 2) {
list($whenwho, $sha) = $info;
$this->User->School->useModel();
$secret = $this->User->School->field('secret', array('id' => 1));
if ($sha === sha1($whenwho.'@'.$secret)) {
$info = explode('.', $whenwho);
if (count($info) == 2) {
$when = intval($info[0]);
$who = intval($info[1]);
$diff = time() - $when;
if (-30 <= $diff and $diff <= 45) {
$this->User->useModel();
$user = $this->User->read(null, $who);
if ($user) {
//pr($user); exit;
$user_id = $who;
$this->auth->login($user['User']);
}
} else if ($diff > 30) {
$error = 'The system took too long to authenticate.
Please go back and try again.';
}
}
}
}
if (empty($user_id)) {
$this->flash($error, '/users/login');
} else {
$this->redirect($this->pglms->defaultPage($user_id));
}
}
function logout() {
$success = $this->auth->attemptLogout();
$this->flash($success? 'Logout successful': 'Logout failed', '/');
}
function view($id) {
$this->redirect('/users/profile/'.$id);
}
function profile($id = null) {
// this function deprecates function view()
if (empty($id)) {
$id = $this->uid;
} else if ($this->pglms->verifyUserAdmin($id, true)) {
$this->redirect('/users/edit/'.$id);
}
$this->User->useModel(array('User'));
$user = $this->User->findById($id, null, null, 0);
$this->set("user", $user['User']);
$this->pageTitle = 'User Profile';
}
function admin() {
// Default landing page for school administrators
$role = $this->pglms->verifyAdmin();
$this->User->useModel('School');
$user = $this->User->findById($this->uid, array('School.description', 'School.school_name'));
$sch_name = empty($user['School']['description'])? $user['School']['school_name']: $user['School']['description'];
$this->pageTitle = $sch_name.' Administration';
$this->set('role', $role);
}
function home() {
$this->redirect($this->pglms->defaultPage($this->uid));
}
function grades($section_id, $student_id=null, $filter='all') {
if (($student_id == $this->uid) or !is_numeric($student_id)) {
$role = $this->pglms->verifySectionUser($section_id, true);
$student_id = $this->uid;
} else {
// Verify that the user is a teacher of this section
$role = $this->pglms->verifySectionUser($section_id, false);
}
$status_lists = array(
'all' => array(), // Every assignment
'done' => array(), // Completed, and either dateless or already due
'future' => array(), // Not completed, but not due yet either
'missed' => array(), // Not completed, and past due
'ungraded' => array(), // Completed, but ungraded
'extra' => array(), // Extra Credit
'early' => array(), // Completed, but not due yet
'deleted' => array(), // Deleted grades
'pointless' => array(), // Not worth points
'locked' => array(), // Grades that lock an assignment
'retakes' => array(), // Grades marked as allowing a retake
);
if (is_numeric($filter)) {
// Request for a specific assignment, usually from the section gradebook.
// Todo: What if the assignment hasn't been completed yet?
$grades = $this->User->Grade->findAll(array(
'Grade.assignment_id' => $filter,
'Grade.section_id' => $section_id,
'Grade.user_id' => $student_id,
'Grade.display_sequence' => '> 0',
'Grade.completion_status' => '!= Started',
), 'Grade.id', null, null, 1, 0);
if (count($grades) == 1) {
// Move directly along to the specified grade.
$this->redirect('/grades/view/'.$grades[0]['Grade']['id']);
} else {
$filter = intval($filter);
$status_lists[$filter] = array();
}
}
$grades = array();
$this->User->useModel();
$student = $this->User->read(array('User.id', 'User.first_name', 'User.last_name'), $student_id);
$calendar = $this->User->Section->calendar($section_id, $student_id);
$this->User->Section->useModel('Students');
$section = $this->User->Section->findById($section_id);
$dateless = empty($section['Section']['start_date']);
if (!$dateless) {
$now = time();
$now_info = getdate($now);
$today = mktime(0,0,0, $now_info['mon'], $now_info['mday'], $now_info['year']);
}
$required = array();
$progress = array();
foreach ($calendar as $key => $asn) {
$daynum = $asn['SectionsAssgmt']['day_number'];
$aid = $asn['Assignment']['id'];
$status = array(
'Done' => 0,
'Retake' => 0,
'Locked' => 0,
'Started' => 0,
);
if (!empty($asn[0]['completion'])) {
foreach (explode(',', $asn[0]['completion']) as $stat) {
if (array_key_exists($stat, $status)) {
$status[$stat] += 1;
} else {
// Todo: Issue a warning, but only on dev platforms
}
}
}
if ($deleted = intval($asn[0]['deleted_grades'])) {
$status_lists['deleted'][$key] = $deleted;
}
extract($status);
//$worth = round(intval($asn['Assignment']['points']) * $asn['SectionsAssgmt']['weight'] / 100);
$worth = intval($asn['Assignment']['points']);
if ($calendar[$key]['worth'] = $worth) {
$status_lists['all'][$key] = 1;
if ($Locked) $status_lists['locked'][$key] = 1;
if ($Retake) $status_lists['retakes'][$key] = 1;
if ($asn['SectionsAssgmt']['extra_credit_flag']) $status_lists['extra'][$key] = 1;
$due = (!$dateless and !empty($asn['SectionsAssgmt']['date_due']) and strtotime($asn['SectionsAssgmt']['date_due']) < $today);
$status = $Done? (($dateless or $due)? 'done': 'early'): (($dateless or !$due)? 'future': 'missed');
$status_lists[$status][$key] = 1;
if ($Done or $Locked or $deleted) {
$this->User->Grade->useModel();
$grades = $this->User->Grade->findAll(array(
'Grade.user_id' => $student_id,
'Grade.section_id' => $section_id,
'Grade.assignment_id' => $aid,
'Grade.completion_status' => array('Done', 'Locked'),
));
$ungraded = 0;
foreach ($grades as $grade) {
if ($grade['Grade']['date_submitted'] and $grade['Grade']['display_sequence'] > 0 and !$grade['Grade']['date_graded']) {
$parsed['ungraded'][] = $grade;
$ungraded += 1;
}
}
if ($ungraded) $status_lists['ungraded'][$key] = $ungraded;
$calendar[$key]['grades'] = $grades;
}
} else {
$status_lists['pointless'][$key] = 1;
}
if ($asn[0]['num_items']) {
if (array_key_exists($daynum, $required)) {
$required[$daynum] += 1;
if ($Done) $progress[$daynum] += 1;
} else {
$required[$daynum] = 1;
$progress[$daynum] = ($Done? 1: 0);
}
}
if ($filter == $aid) {
$status_lists[$filter][$key] = 1;
}
}
// Cheat: Instead of calculating the grade, let the database do it.
$conditions = array('Taking.id' => intval($section_id), 'User.id' => intval($student_id));
$current_grade = $this->User->current_grades($conditions, $dateless);
$full_grade = $this->User->full_grades($conditions);
$this->set(array(
'calendar' => $calendar,
'required' => $required,
'progress' => $progress,
'student' => $student,
'section' => $section,
'filter' => $filter,
'lists' => $status_lists,
'role' => $role,
'points' => intval($full_grade[0]['Summary']['earned']),
'max_points' => intval($full_grade[0]['Summary']['possible']),
'ptd' => intval($current_grade[0]['Summary']['earned']),
'max_ptd' => intval($current_grade[0]['Summary']['possible']),
));
}
function edit($id) {
// Todo: Allow teachers to edit their own profiles
$role = $this->pglms->verifyUserAdmin($id, true) or $this->redirect('/users/profile/'.$id);
$this->User->useModel(array('User', 'Type', 'Taking', 'Teaching'));
$user = $this->User->read(null, $id);
$enrollment = array();
foreach ($user[$user['Type']['name'] == 'student'? 'Taking': 'Teaching'] as $section) {
$enrollment[] = $section['id'];
}
$this->User->Section->useModel(array('Section', 'School'));
$sections = $this->User->Section->findAll(array(
'Section.school_id' => $this->pglms->adminSchools(),
'or' => array('Section.end_date' => null, 'end_date' => '>= '.$this->User->date()),
'Section.display_sequence' => '> 0',
), array('Section.id', 'Section.section_name', 'Section.client_section_id', 'School.school_name'));
$this->pageTitle = ($this->uid == $id)? 'My Profile' : 'Edit ' . ucfirst($user['Type']['name']);
$this->set('sections', $sections);
$this->set('enrollment', $enrollment);
$this->set('user', $user['User']);
$this->set('type', $user['Type']);
$this->set('role', $role);
}
function save($student_id) {
if (!$this->pglms->verifyUserAdmin($student_id, true)) {
$this->flashback('Permission Denied.', '/users/profile/'.$student_id);
} else if (empty($this->data['User'])) {
$this->flashback('There was a problem loading the form data', '/users/edit/'.$student_id);
} else {
$this->User->id = $student_id;
if ($this->User->save($this->data['User'])) {
// Modify the sections
if (!empty($this->data['Section'])) {
$user = $this->User->read(null, $student_id);
$user_id = $user['User']['id'];
$user_type = $user['Type']['name'];
$user_name = $user['User']['first_name'] . ' ' . $user['User']['last_name'];
$messages = array('Your changes have been saved.');
$selected = $this->data['Section']['id'];
$keepers = array();
foreach ($user[$user['Type']['name'] == 'student'? 'Taking': 'Teaching'] as $section) {
$section_id = $section['id'];
if (in_array($section_id, $selected)) {
$keepers[$section_id] = true;
} else if (!$this->SectionsUser->del($section_id, $user_id, $user_type)) {
$section_name = empty($section['section_name'])? 'section #'.$section_id: $section['section_name'];
$messages[] = "$user_name could not be removed from $section_name.";
}
}
foreach ($selected as $section_id) {
if (empty($keepers[$section_id])) {
$section = $this->User->Section->read(array('Section.school_id', 'Section.section_name'), $section_id);
$section_name = empty($section['Section']['section_name'])? 'section #'.$section_id: $section['Section']['section_name'];
if ($this->pglms->verifyAdmin($section['Section']['school_id'], false)) {
$result = $this->SectionsUser->add($section_id, $user_id, $user_type);
if (!$result) {
$messages[] = "$user_name could not be added to $section_name.";
}
} else {
$messages[] = "You do not have permission to add students to $section_name.";
}
}
}
}
$this->flashwayback(join("\n
", $messages), '/users/edit/'.$student_id);
} else {
$this->flashback('There was a problem saving your changes.', '/users/edit/'.$student_id);
}
}
}
function add($user_type, $school_id = null) {
$this->pglms->verifyAdmin($school_id);
if (!empty($this->data['User'])) {
// give this user the proper role (user_type_id)
$role = $this->User->UserType->findByName($user_type, 'UserType.id', null, 0);
$this->data['User']['user_type_id'] = $role['UserType']['id'];
$this->data['User']['user_type'] = $user_type;
// give this user the proper school_id
$this->data['User']['school_id'] = $school_id? $school_id: $this->Session->read('school_id');
// define the creation date
$this->data['User']['date_created'] = date('Y-m-d H:i:s');
$this->User->id = null;
if ($this->User->save($this->data['User'])) {
if (!empty($this->data['Section'])) {
$result = $this->SectionsUser->add($this->data['Section']['id'], $this->User->id, $user_type);
}
$this->flashwayback("The new $user_type has been added.", '/users/'.$user_type);
} else {
$message = "There was a problem saving the $user_type data.";
if (!empty($this->User->validationErrors)) {
$fields = array();
foreach ($this->User->validationErrors as $field => $invalid) {
if ($invalid) $fields[] = $field;
}
if ($fields) {
$field_names = $this->pglms->expand_list($fields);
$s = count($fields) == 1? '': 's';
$message .= "
Please check the $field_names field$s.";
}
}
$this->Session->setFlash($message);
}
}
$user = $this->User->read();
if (in_array($user_type, array('student', 'teacher'))) {
$this->User->Section->useModel();
$sections = $this->User->Section->findAll(array(
'Section.school_id' => $school_id? $school_id: $this->pglms->adminSchools(),
'or' => array(
'end_date' => null,
'Section.end_date' => '>= ' . $this->User->date(),
),
'Section.display_sequence' => '> 0',
));
} else {
$sections = null;
}
$this->set('school_id', $school_id);
$this->set('sections', $sections);
$this->set('user', $user['User']);
$this->set('user_type', $user_type);
}
function delete($user_id) {
if ($this->pglms->verifyUserAdmin($user_id, false)) {
$result = $this->User->delete($user_id);
$message = $result? 'User deleted.': 'Failed to delete user.';
} else {
$message = 'You lack permission to delete this user.';
}
$this->flashback($message, '/users/students');
}
function teaching($school_id = null, $teacher_id = null) {
if (empty($teacher_id)) $teacher_id = $this->uid;
$students = array();
$conditions = array(
'User.id' => intval($teacher_id),
'SectionsUser.dropped' => null,
'SectionsUser.role' => 'teacher',
);
if ($school_id) $conditions['Section.school_id'] = intval($school_id);
$teaching = $this->SectionsUser->findAll($conditions);
foreach ($teaching as $section) {
$taking = $this->SectionsUser->findAll(array(
'Section.id' => $section['Section']['id'],
'SectionsUser.dropped' => null,
'SectionsUser.role' => 'student',
));
foreach ($taking as $student) {
$key = $student['User']['last_name'].'/'.$student['User']['first_name'].'/'.$student['User']['id'];
$students[$key][] = $student;
}
}
ksort($students);
$this->pageTitle = 'Students in Your Sections';
$this->set('students', $students);
$this->set('sections', $teaching);
}
function teachers($sequence = '> 0') {
$schools = $this->pglms->adminSchools();
$criteria = $this->pglms->search_conditions(array(
'User.username',
'User.client_student_id',
'User.first_name',
'User.last_name',
'User.email',
), array(
'User.user_type' => 'teacher',
'User.school_id' => $schools,
'User.display_sequence' => $sequence,
));
list($order, $limit, $page) = $this->Pagination->init($criteria);
$order = array($order, 'User.last_name', 'User.first_name');
$this->User->useModel('Teaching');
$teachers = $this->User->findAll($criteria, null, $order, $limit, $page);
foreach ($teachers as $key => $teacher) {
$teachers[$key]['lag_time'] = $this->User->getLagTime($teacher['User']['id']);
}
$this->set('teachers', $teachers);
}
function students($sequence = '> 0') {
$criteria = $this->pglms->search_conditions(array(
'User.username',
'User.client_student_id',
'User.first_name',
'User.last_name',
'User.email',
), array(
'User.user_type' => 'student',
'User.school_id' => $this->pglms->adminSchools(),
'User.display_sequence' => $sequence,
));
list($order, $limit, $page) = $this->Pagination->init($criteria);
$order = array($order, 'User.last_name', 'User.first_name');
$this->User->useModel(array('User', 'Type', 'Taking'));
$students = $this->User->findAll($criteria, null, $order, $limit, $page);
$this->set('students', $students);
}
function unstarted($section_id = null) {
// CSV report of students who haven't logged in or done anything
$this->pglms->blankLayout();
if ($section_id) {
$sections = array($this->User->Section->read(null, $section_id));
$this->pglms->verifyAdmin($sections[0]['Section']['school_id']);
$unlogged = $this->SectionsUser->findAll(array(
'User.last_login' => null,
'SectionsUser.section_id' => $section_id,
'SectionsUser.dropped' => null,
'SectionsUser.role' => 'student',
));
} else {
$this->pglms->verifyAdmin();
$schools = $this->pglms->adminSchools();
$sections = $this->User->Section->findAll(array('Section.school_id' => $schools));
$unlogged = $this->User->findAll(array(
'User.last_login' => null,
'User.school_id' => $schools,
));
}
$this->set('sections', $sections);
$this->set('unlogged', $unlogged);
}
function dns($section_id = null) {
// "Did Not Start" report -- students who haven't logged in or done anything
if (!empty($this->data['Section']['id'])) $section_id = intval($this->data['Section']['id']);
if ($section_id) {
$this->pglms->verifySectionUser($section_id);
$this->User->Section->useModel(array('Section', 'Teachers'));
$section = $this->User->Section->read(null, $section_id);
$this->set('section', $section);
$this->SectionsUser->useModel(array('User'));
$this->SectionsUser->User->useModel(array('School'));
$unlogged = $this->SectionsUser->findAll(array(
'User.last_login' => null,
'SectionsUser.dropped' => null,
'SectionsUser.role' => 'student',
'SectionsUser.section_id' => $section_id,
), null, null, null, null, 2);
} else {
$this->pglms->verifyAdmin();
$schools = $this->pglms->adminSchools();
$this->User->useModel(array('User', 'School', 'Taking'));
$this->User->School->useModel(array());
$this->User->Taking->useModel(array('Teachers'));
$unlogged = $this->User->findAll(array(
'User.last_login' => null,
'User.school_id' => $schools,
), null, null, null, null, 2);
}
$this->set('unlogged', $unlogged);
}
function delinquency($section_id = null, $days = null) {
if (!empty($this->data['Days']['number'])) $days = intval($this->data['Days']['number']);
if (!empty($this->data['Section']['id'])) $section_id = intval($this->data['Section']['id']);
$conditions = array('Type.name' => 'student');
if (!empty($section_id) and is_numeric($section_id)) {
$this->pglms->verifySectionUser($section_id);
$conditions['Taking.id'] = $section_id;
} else if ($this->pglms->verifyAdmin(null, false)) {
$school_list = $this->pglms->adminSchools();
$conditions['and']['or'] = array(
'Taking.school_id' => $school_list,
'User.school_id' => $school_list,
);
} else {
$this->User->useModel(array('Teaching'));
$user = $this->User->read('User.id', $this->uid);
$sections = array();
foreach ($user['Teaching'] as $section) $sections[] = $section['id'];
if ($sections) {
$conditions['Taking.id'] = $sections;
} else {
$conditions['Taking.id'] = null;
$conditions['User.id'] = $this->uid;
}
}
if ($days and is_numeric($days)) {
$conditions['or'] = array(
'and' => array('User.last_login' => null),
'User.last_login' => date('< YmdHis', time() - (60*60*24*$days)),
);
} else {
$conditions['User.last_login'] = null;
}
$this->User->useModel(array('User', 'Type', 'School', 'Taking'));
$users = $this->User->findAll($conditions, array(
'User.first_name',
'User.last_name',
'User.client_student_id',
'User.last_login',
'Taking.section_name',
'Taking.client_section_id',
'School.school_name',
), array('User.last_name', 'User.first_name'));
$this->set('users', $users);
$this->set('days', is_numeric($days)? $days: 0);
$this->set('section_id', is_numeric($section_id)? $section_id: 'all');
}
function failing($section_id = null, $threshold = null, $flags = null) {
if (!empty($this->data['Section']['id'])) $section_id = intval($this->data['Section']['id']);
if (isset($this->data['Grades']['threshold'])) $threshold = $this->data['Grades']['threshold'];
if ($threshold == 'zero') $threshold = 0;
$flag_list = array('done' => false, 'future' => false, 'missing' => false, 'ungraded' => false, 'extra' => false, 'early' => false);
$flags_requested = empty($flags)? array(): explode('_', $flags);
foreach (array_keys($flag_list) as $flag) {
if (!empty($this->data['Grades'][$flag])) $flag_list[$flag] = true;
if (in_array($flag, $flags_requested)) $flag_list[$flag] = true;
}
$conditions = array();
if (!empty($section_id) and is_numeric($section_id)) {
$this->pglms->verifySectionUser($section_id);
$conditions['Taking.id'] = $section_id;
} else if ($this->pglms->verifyAdmin(null, false)) {
$school_list = $this->pglms->adminSchools();
$conditions['or'] = array(
'Taking.school_id' => $school_list,
'User.school_id' => $school_list,
);
} else {
$this->User->useModel(array('Teaching'));
$user = $this->User->read('User.id', $this->uid);
$sections = array();
foreach ($user['Teaching'] as $section) $sections[] = $section['id'];
if ($sections) {
$conditions['Taking.id'] = $sections;
} else {
$conditions['User.id'] = $this->uid;
}
}
$users = $this->User->getStudentGrades($conditions, $threshold, $flag_list);
$this->set('users', $users);
$this->set('flags', $flag_list);
$this->set('threshold', $threshold? $threshold: 'zero');
$this->set('section_id', is_numeric($section_id)? $section_id: 'all');
}
}
?>