/** * Get offering gradebook * * @return obj */ public function gradebook($oid = null) { if (!isset($this->_gradebook)) { $course = new Course($this->get('course_id')); $course->offering($this->get('id')); $course->offering()->section($this->section()->get('id')); $this->_gradebook = new GradeBook($oid, $course); } return $this->_gradebook; }
/** * Calculate scores for each unit and the course as a whole * * @param int $member_id * @param int $asset_id * @return boolean true on success, false otherwise */ public function calculateScores($member_id = null, $asset_id = null) { // We need one of $course or $asset_id if (is_null($this->course) && is_null($asset_id)) { return false; } // Get the course id if (!is_null($this->course) && is_object($this->course)) { // Get our course model as well (to retrieve grade policy) $course = $this->course; $course_id = $this->course->get('id'); } elseif (!is_null($asset_id) && is_numeric($asset_id)) { $asset = new Tables\Asset(\App::get('db')); $asset->load($asset_id); $course_id = $asset->course_id; // Get our course model as well (to retrieve grade policy) $course = new Course($course_id); } else { // Could not determine course id return false; } if (!is_null($member_id) && !empty($member_id)) { if (!is_array($member_id)) { $member_id = (array) $member_id; } } else { // Pull all offering members $members = $course->offering()->students(); $member_id = array(); // Get member id's for refresh filter foreach ($members as $member) { $member_id[] = $member->get('id'); } } // Get our units and track which units have grades that might need to be cleared $unit_ids = array(); $units = $course->offering()->units(); foreach ($units as $unit) { $unit_ids[$unit->get('id')] = $member_id; } // Get a grade policy object $gradePolicy = new GradePolicies($course->offering()->section()->get('grade_policy_id'), $course->offering()->section()->get('id')); // Calculate course grades, start by getting all grades $filters = array('member_id' => $member_id, 'scope' => 'asset', 'graded' => true); $results = $this->_grades($filters); $grades = array(); $scores = array(); foreach ($results as $grade) { if (is_null($grade->score) && is_null($grade->override)) { continue; } // Check for overrides if ($grade->override) { $grades[$grade->member_id][$grade->unit_id][$grade->scope_id] = array('score' => $grade->override, 'weighting' => $grade->grade_weight); } else { $grades[$grade->member_id][$grade->unit_id][$grade->scope_id] = array('score' => $grade->score, 'weighting' => $grade->grade_weight); } } if (count($grades) > 0) { foreach ($grades as $member_id => $values) { $scores[$member_id]['course_exam_count'] = 0; $scores[$member_id]['course_quiz_count'] = 0; $scores[$member_id]['course_homework_count'] = 0; $scores[$member_id]['course_exam_sum'] = 0; $scores[$member_id]['course_quiz_sum'] = 0; $scores[$member_id]['course_homework_sum'] = 0; // Loop through units and compute scores foreach ($values as $unit_id => $val) { // We're processing this unit/member, thus it doesn't need to be cleared - so remove it from the list of potentials if (isset($unit_ids[$unit_id]) && ($key = array_search($member_id, $unit_ids[$unit_id])) !== false) { unset($unit_ids[$unit_id][$key]); } $scores[$member_id]['units'][$unit_id]['exam_count'] = 0; $scores[$member_id]['units'][$unit_id]['quiz_count'] = 0; $scores[$member_id]['units'][$unit_id]['homework_count'] = 0; $scores[$member_id]['units'][$unit_id]['exam_sum'] = 0; $scores[$member_id]['units'][$unit_id]['quiz_sum'] = 0; $scores[$member_id]['units'][$unit_id]['homework_sum'] = 0; foreach ($val as $grade) { switch ($grade['weighting']) { case 'exam': $scores[$member_id]['course_exam_count']++; $scores[$member_id]['course_exam_sum'] += $grade['score']; $scores[$member_id]['units'][$unit_id]['exam_count']++; $scores[$member_id]['units'][$unit_id]['exam_sum'] += $grade['score']; break; case 'quiz': $scores[$member_id]['course_quiz_count']++; $scores[$member_id]['course_quiz_sum'] += $grade['score']; $scores[$member_id]['units'][$unit_id]['quiz_count']++; $scores[$member_id]['units'][$unit_id]['quiz_sum'] += $grade['score']; break; case 'homework': $scores[$member_id]['course_homework_count']++; $scores[$member_id]['course_homework_sum'] += $grade['score']; $scores[$member_id]['units'][$unit_id]['homework_count']++; $scores[$member_id]['units'][$unit_id]['homework_sum'] += $grade['score']; break; } } if ($scores[$member_id]['units'][$unit_id]['exam_count'] > 0) { $scores[$member_id]['units'][$unit_id]['exam_score'] = $scores[$member_id]['units'][$unit_id]['exam_sum'] / $scores[$member_id]['units'][$unit_id]['exam_count']; $scores[$member_id]['units'][$unit_id]['exam_weight'] = $gradePolicy->get('exam_weight') > 0 ? $gradePolicy->get('exam_weight') : 0; } else { $scores[$member_id]['units'][$unit_id]['exam_score'] = null; $scores[$member_id]['units'][$unit_id]['exam_weight'] = null; } if ($scores[$member_id]['units'][$unit_id]['quiz_count'] > 0) { $scores[$member_id]['units'][$unit_id]['quiz_score'] = $scores[$member_id]['units'][$unit_id]['quiz_sum'] / $scores[$member_id]['units'][$unit_id]['quiz_count']; $scores[$member_id]['units'][$unit_id]['quiz_weight'] = $gradePolicy->get('quiz_weight') > 0 ? $gradePolicy->get('quiz_weight') : 0; } else { $scores[$member_id]['units'][$unit_id]['quiz_score'] = null; $scores[$member_id]['units'][$unit_id]['quiz_weight'] = null; } if ($scores[$member_id]['units'][$unit_id]['homework_count'] > 0) { $scores[$member_id]['units'][$unit_id]['homework_score'] = $scores[$member_id]['units'][$unit_id]['homework_sum'] / $scores[$member_id]['units'][$unit_id]['homework_count']; $scores[$member_id]['units'][$unit_id]['homework_weight'] = $gradePolicy->get('homework_weight') > 0 ? $gradePolicy->get('homework_weight') : 0; } else { $scores[$member_id]['units'][$unit_id]['homework_score'] = null; $scores[$member_id]['units'][$unit_id]['homework_weight'] = null; } $numerator = array_sum(array($scores[$member_id]['units'][$unit_id]['exam_score'] * $gradePolicy->get('exam_weight'), $scores[$member_id]['units'][$unit_id]['quiz_score'] * $gradePolicy->get('quiz_weight'), $scores[$member_id]['units'][$unit_id]['homework_score'] * $gradePolicy->get('homework_weight'))); $denominator = array_sum(array($scores[$member_id]['units'][$unit_id]['exam_weight'], $scores[$member_id]['units'][$unit_id]['quiz_weight'], $scores[$member_id]['units'][$unit_id]['homework_weight'])); if ($denominator) { $scores[$member_id]['units'][$unit_id]['unit_weighted'] = $numerator / $denominator; } else { $scores[$member_id]['units'][$unit_id]['unit_weighted'] = NULL; } } // Now calculate overall course scores if ($scores[$member_id]['course_exam_count'] > 0) { $scores[$member_id]['course_exam_score'] = $scores[$member_id]['course_exam_sum'] / $scores[$member_id]['course_exam_count']; $scores[$member_id]['course_exam_weight'] = $gradePolicy->get('exam_weight') > 0 ? $gradePolicy->get('exam_weight') : 0; } else { $scores[$member_id]['course_exam_score'] = null; $scores[$member_id]['course_exam_weight'] = null; } if ($scores[$member_id]['course_quiz_count'] > 0) { $scores[$member_id]['course_quiz_score'] = $scores[$member_id]['course_quiz_sum'] / $scores[$member_id]['course_quiz_count']; $scores[$member_id]['course_quiz_weight'] = $gradePolicy->get('quiz_weight') > 0 ? $gradePolicy->get('quiz_weight') : 0; } else { $scores[$member_id]['course_quiz_score'] = null; $scores[$member_id]['course_quiz_weight'] = null; } if ($scores[$member_id]['course_homework_count'] > 0) { $scores[$member_id]['course_homework_score'] = $scores[$member_id]['course_homework_sum'] / $scores[$member_id]['course_homework_count']; $scores[$member_id]['course_homework_weight'] = $gradePolicy->get('homework_weight') > 0 ? $gradePolicy->get('homework_weight') : 0; } else { $scores[$member_id]['course_homework_score'] = null; $scores[$member_id]['course_homework_weight'] = null; } $numerator = array_sum(array($scores[$member_id]['course_exam_score'] * $gradePolicy->get('exam_weight'), $scores[$member_id]['course_quiz_score'] * $gradePolicy->get('quiz_weight'), $scores[$member_id]['course_homework_score'] * $gradePolicy->get('homework_weight'))); $denominator = array_sum(array($scores[$member_id]['course_exam_weight'], $scores[$member_id]['course_quiz_weight'], $scores[$member_id]['course_homework_weight'])); if ($denominator) { $scores[$member_id]['course_weighted'] = $numerator / $denominator; } else { $scores[$member_id]['course_weighted'] = NULL; } } } else { // Make sure nothing is lingering around...given that there shouldn't be any grades there $this->_tbl->clearGrades($member_id, $course); } $this->_tbl->saveGrades($scores, $course_id); $this->_tbl->clearUnits($unit_ids); // Success return true; }
/** * Track asset views * * @param object $course \Components\Courses\Models\Course * @return mixed */ public function logView($course = null) { require_once dirname(__DIR__) . DS . 'tables' . DS . 'asset.views.php'; if (!$course || !is_object($course)) { $gid = Request::getVar('gid'); $offering = Request::getVar('offering'); $section = Request::getVar('section'); $course = new Course($gid); $course->offering($offering); $course->offering()->section($section); } $member = $course->offering()->section()->member(User::get('id')); if (!$member->get('id')) { $member = $course->offering()->member(User::get('id')); } if (!$member || !is_object($member) || !$member->get('id')) { return false; } $view = new Tables\AssetViews($this->_db); $view->asset_id = $this->_tbl->id; $view->course_id = $this->get('course_id'); $view->viewed = Date::toSql(); $view->viewed_by = $member->get('id'); $view->ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; $view->url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; $view->referrer = isset($_SERVER['HTTP_REFERRER']) ? $_SERVER['HTTP_REFERRER'] : ''; $view->user_agent_string = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $view->session_id = App::get('session')->getId(); if (!$view->store()) { $this->setError($view->getError()); } }