/** * Deletes an asset * * @apiMethod POST * @apiUri /courses/asset/delete * @apiParameter { * "name": "asset_id", * "description": "ID of asset to delete", * "type": "integer", * "required": true, * "default": null * } * @apiParameter { * "name": "scope", * "description": "Asset scope", * "type": "string", * "required": true, * "default": null * } * @apiParameter { * "name": "scope_id", * "description": "Asset scope ID", * "type": "integer", * "required": true, * "default": null * } * @return void */ public function deleteTask() { // Require authentication and authorization $this->authorizeOrFail(); // First, delete the asset association $database = App::get('db'); $assocObj = new AssetAssociation($database); // Get vars $asset_id = Request::getInt('asset_id', 0); $scope = Request::getCmd('scope', 'asset_group'); $scope_id = Request::getInt('scope_id', 0); // Make sure we're not missing anything if (!$asset_id || !$scope || !$scope_id) { // Missing needed variables to identify asset association App::abort(404, 'Missing one of asset id, scope, or scope id'); } else { // Try to load the association if (!$assocObj->loadByAssetScope($asset_id, $scope_id, $scope)) { App::abort(500, 'Loading asset association failed'); } else { // Delete the association if (!$assocObj->delete()) { App::abort(500, $assocObj->getError()); } } } // Then, lookup whether or not there are other assocations connected to this asset $assetObj = new AssetTbl($database); if (!$assetObj->load($asset_id)) { App::abort(500, "Loading asset {$id} failed"); } // See if the asset is orphaned if (!$assetObj->isOrphaned()) { // Asset isn't an orphan (i.e. it's still being used elsewhere), so we're done $this->send(['asset_id' => $assetObj->id]); return; } // If no other associations exist, we'll delete the asset file and folder on the file system $deleted = []; $params = Component::params('com_courses'); $path = DS . trim($params->get('uploadpath', '/site/courses'), DS) . DS . $this->course_id . DS . $assetObj->id; // If the path exists, delete it! if (Filesystem::exists($path)) { $deleted = Filesystem::listFolderTree($path); Filesystem::deleteDirectory($path); } // Then we'll delete the asset entry itself if (!$assetObj->delete()) { App::abort(500, $assetObj->getError()); } // Return message $this->send(['asset_id' => $assetObj->id, 'deleted' => $deleted]); }
/** * 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; }
/** * Edit a course page * * @return void */ public function editTask($model = null) { Request::setVar('hidemainmenu', 1); if (!is_object($model)) { // Incoming $ids = Request::getVar('id', array()); // Get the single ID we're working with if (is_array($ids)) { $id = !empty($ids) ? $ids[0] : 0; } else { $id = $ids ? $ids : 0; } $model = new Tables\Asset($this->database); $model->load($id); } $this->view->row = $model; $this->view->tmpl = Request::getVar('tmpl', ''); $this->view->scope = Request::getVar('scope', 'asset_group'); $this->view->scope_id = Request::getInt('scope_id', 0); $this->view->course_id = Request::getInt('course_id', 0); $this->view->config = $this->config; // Set any errors foreach ($this->getErrors() as $error) { \Notify::error($error); } // Output the HTML $this->view->setLayout('edit')->display(); }