set_type(LINK_STUDENTPUBLICATION); } /** * * Returns the URL of a document * This function is loaded when using a gradebook as a tab (gradebook = -1) * see issue #2705 * */ public function get_view_url($stud_id) { // find a file uploaded by the given student, // with the same title as the evaluation name $eval = $this->get_evaluation(); $stud_id = intval($stud_id); $sql = 'SELECT pub.url FROM '.$this->get_itemprop_table().' prop, '.$this->get_studpub_table().' pub' ." WHERE prop.c_id = ".$this->course_id." AND pub.c_id = ".$this->course_id." AND prop.tool = 'work'" .' AND prop.insert_user_id = '.$stud_id .' AND prop.ref = pub.id' ." AND pub.title = '".Database::escape_string($eval->get_name())."' AND pub.session_id=".api_get_session_id().""; $result = Database::query($sql); if ($fileurl = Database::fetch_row($result)) { return null; } else { return null; } } public function get_type_name() { return get_lang('Works'); } public function is_allowed_to_change_name() { return false; } /** * Generate an array of exercises that a teacher hasn't created a link for. * @return array 2-dimensional array - every element contains 2 subelements (id, name) */ public function get_not_created_links() { return false; if (empty($this->course_code)) { die('Error in get_not_created_links() : course code not set'); } $tbl_grade_links = Database :: get_main_table(TABLE_MAIN_GRADEBOOK_LINK); $sql = 'SELECT id, url from '.$this->get_studpub_table() .' pup WHERE c_id = '.$this->course_id.' AND has_properties != '."''".' AND id NOT IN' .' (SELECT ref_id FROM '.$tbl_grade_links .' WHERE type = '.LINK_STUDENTPUBLICATION ." AND course_code = '".Database::escape_string($this->get_course_code())."'" .') AND pub.session_id='.api_get_session_id().''; $result = Database::query($sql); $cats=array(); while ($data=Database::fetch_array($result)) { $cats[] = array ($data['id'], $data['url']); } return $cats; } /** * Generate an array of all exercises available. * @return array 2-dimensional array - every element contains 2 subelements (id, name) */ public function get_all_links() { if (empty($this->course_code)) { die('Error in get_not_created_links() : course code not set'); } $tbl_grade_links = Database :: get_course_table(TABLE_STUDENT_PUBLICATION); $session_id = api_get_session_id(); /* if (empty($session_id)) { $session_condition = api_get_session_condition(0, true); } else { $session_condition = api_get_session_condition($session_id, true, true); } $sql = "SELECT id, url, title FROM $tbl_grade_links WHERE c_id = {$this->course_id} AND filetype='folder' AND active = 1 $session_condition ";*/ //Only show works from the session //AND has_properties != '' $sql = "SELECT id, url, title FROM $tbl_grade_links WHERE c_id = {$this->course_id} AND active = 1 AND filetype='folder' AND session_id = ".api_get_session_id().""; $result = Database::query($sql); while ($data = Database::fetch_array($result)) { $work_name = $data['title']; if (empty($work_name)) { $work_name = basename($data['url']); } $cats[] = array ($data['id'], $work_name); } $cats=isset($cats) ? $cats : array(); return $cats; } /** * Has anyone done this exercise yet ? */ public function has_results() { $tbl_grade_links = Database :: get_course_table(TABLE_STUDENT_PUBLICATION); $sql = 'SELECT count(*) AS number FROM '.$tbl_grade_links." WHERE c_id = {$this->course_id} AND parent_id = '".intval($this->get_ref_id())."' AND session_id =".api_get_session_id().""; $result = Database::query($sql); $number = Database::fetch_row($result); return ($number[0] != 0); } /** * @param null $stud_id * @return array|null */ public function calc_score($stud_id = null, $type = null) { $stud_id = intval($stud_id); $table = Database::get_course_table(TABLE_STUDENT_PUBLICATION); $sql = 'SELECT * FROM '.$table." WHERE c_id = {$this->course_id} AND id = '".intval($this->get_ref_id())."' AND session_id = ".api_get_session_id()." " ; $query = Database::query($sql); $assignment = Database::fetch_array($query); if (count($assignment) == 0) { $parentId = '0'; } else { $parentId = $assignment['id']; } $sql = 'SELECT * FROM '.$table.' WHERE c_id = '.$this->course_id.' AND active = 1 AND parent_id = "'.$parentId.'" AND session_id = '.api_get_session_id() .' AND qualificator_id <> 0 '; if (!empty($stud_id)) { $sql .= " AND user_id = $stud_id "; } $order = api_get_setting('student_publication_to_take_in_gradebook'); switch ($order) { case 'last': // latest attempt $sql .= ' ORDER BY sent_date DESC'; break; case 'first': default: // first attempt $sql .= ' ORDER BY id'; break; } $scores = Database::query($sql); // for 1 student if (!empty($stud_id)) { if ($data = Database::fetch_array($scores)) { return array( $data['qualification'], $assignment['qualification'] ); } else { return ''; } } else { $students = array(); // user list, needed to make sure we only // take first attempts into account $rescount = 0; $sum = 0; $bestResult = 0; $weight = 0; $sumResult = 0; $myResult = 0; while ($data = Database::fetch_array($scores)) { if (!(array_key_exists($data['user_id'], $students))) { if ($assignment['qualification'] != 0) { $students[$data['user_id']] = $data['qualification']; $rescount++; $sum += $data['qualification'] / $assignment['qualification']; $sumResult += $data['qualification']; if ($data['qualification'] > $bestResult) { $bestResult = $data['qualification']; } $weight = $assignment['qualification']; } } } if ($rescount == 0) { return null; } else { switch ($type) { case 'best': return array($bestResult, $weight); break; case 'average': return array($sumResult/$rescount, $weight); break; case 'ranking': return AbstractLink::getCurrentUserRanking($stud_id, $students); break; default: return array($sum, $rescount); break; } } } } /** * Lazy load function to get the database table of the student publications */ private function get_studpub_table() { return $this->studpub_table = Database :: get_course_table(TABLE_STUDENT_PUBLICATION); } /** * Lazy load function to get the database table of the item properties */ private function get_itemprop_table() { return $this->itemprop_table = Database :: get_course_table(TABLE_ITEM_PROPERTY); } public function needs_name_and_description() { return false; } public function get_name() { $this->get_exercise_data(); return (isset($this->exercise_data['title']) && !empty($this->exercise_data['title'])) ? $this->exercise_data['title'] : get_lang('Untitled'); } public function get_description() { $this->get_exercise_data(); return isset($this->exercise_data['description']) ? $this->exercise_data['description'] : null; } public function get_test_id() { return 'DEBUG:ID'; } public function get_link() { $session_id = api_get_session_id(); $url = api_get_path(WEB_PATH).'main/work/work.php?session_id='.$session_id.'&cidReq='.$this->get_course_code().'&id='.$this->exercise_data['id'].'&gradebook=view'; return $url; } private function get_exercise_data() { $tbl_name = $this->get_studpub_table(); $course_info = api_get_course_info($this->get_course_code()); if ($tbl_name=='') { return false; } elseif (!isset($this->exercise_data)) { $sql = 'SELECT * FROM '.$this->get_studpub_table()." WHERE c_id ='".$course_info['real_id']."' AND id = '".intval($this->get_ref_id())."' "; $query = Database::query($sql); $this->exercise_data = Database::fetch_array($query); } return $this->exercise_data; } public function needs_max() { return false; } public function needs_results() { return false; } public function is_valid_link() { $sql = 'SELECT count(id) FROM '.$this->get_studpub_table().' WHERE c_id = "'.$this->course_id.'" AND id = '.intval($this->get_ref_id()).''; $result = Database::query($sql); $number = Database::fetch_row($result); return ($number[0] != 0); } public function get_icon_name() { return 'studentpublication'; } public function save_linked_data() { $weight = (float)$this->get_weight(); $ref_id = $this->get_ref_id(); if (!empty($ref_id)) { //Cleans works $sql = 'UPDATE '.$this->get_studpub_table().' SET weight= '.$weight.' WHERE c_id = '.$this->course_id.' AND id ='.$ref_id; Database::query($sql); } } public function delete_linked_data() { $ref_id = $this->get_ref_id(); if (!empty($ref_id)) { //Cleans works $sql = 'UPDATE '.$this->get_studpub_table().' SET weight=0 WHERE c_id = '.$this->course_id.' AND id ='.$ref_id; Database::query($sql); } } }