Esempio n. 1
0
 /**
  * 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]);
 }
Esempio n. 2
0
 /**
  * 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;
 }
Esempio n. 3
0
 /**
  * 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();
 }