From f4846b5d44e3cab34ca3dd2916fd071f67fbf0dd Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Fri, 19 Feb 2010 21:29:39 +0200 Subject: [PATCH 1/4] Feature #272 - An insignificant change in the internationalization library. --- main/inc/lib/internationalization.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/inc/lib/internationalization.lib.php b/main/inc/lib/internationalization.lib.php index a74ffe5aae..13941a8330 100755 --- a/main/inc/lib/internationalization.lib.php +++ b/main/inc/lib/internationalization.lib.php @@ -129,7 +129,7 @@ function get_lang($variable, $notrans = 'DLTT', $language = null) { // Caching results from some API functions, for speed. static $langpath; if (!isset($langpath)) { - $langpath = api_get_path(SYS_CODE_PATH).'lang/'; + $langpath = api_get_path(SYS_LANG_PATH); } static $test_server_mode; if (!isset($test_server_mode)) { From 241d145d8378c9d01503e597f75b75ceb79d77e6 Mon Sep 17 00:00:00 2001 From: Arthur Portugal Date: Fri, 19 Feb 2010 14:55:24 -0500 Subject: [PATCH 2/4] Added a new file evaluation.class.test.php CT#191 --- .../lib/be/evaluation.class.test.php | 353 ++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100644 tests/main/gradebook/lib/be/evaluation.class.test.php diff --git a/tests/main/gradebook/lib/be/evaluation.class.test.php b/tests/main/gradebook/lib/be/evaluation.class.test.php new file mode 100644 index 0000000000..df385a43a7 --- /dev/null +++ b/tests/main/gradebook/lib/be/evaluation.class.test.php @@ -0,0 +1,353 @@ +UnitTestCase('Test Evaluation'); + } + + + public function __construct() { + // The constructor acts like a global setUp for the class + require_once api_get_path(SYS_TEST_PATH).'setup.inc.php'; + global $date; + $this->evaluation = new Evaluation(); + $this->evaluation-> set_id (1); + $this->evaluation-> set_name ('test'); + $this->evaluation-> set_description ('test description'); + $this->evaluation-> set_user_id (1); + $this->evaluation-> set_course_code ('COURSETEST'); + $this->evaluation-> set_category_id (1); + $this->evaluation-> set_date ($date); + $this->evaluation-> set_weight (1); + $this->evaluation-> set_max (1); + $this->evaluation-> set_visible (1); + } + + /** + * Insert this evaluation into the database + */ + + public function testadd() { + $res = $this->evaluation->add(); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testadd_evaluation_log() { + $idevaluation = 1; + $res = $this->evaluation->add_evaluation_log($idevaluation); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + /** + * Calculate the score of this evaluation + * @param $stud_id student id (default: all students who have results for this eval - then the average is returned) + * @return array (score, max) if student is given + * array (sum of scores, number of scores) otherwise + * or null if no scores available + */ + + public function testcalc_score() { + $res = $this->evaluation->calc_score($stud_id = null); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + /** + * Delete this evaluation from the database + */ + + public function testdelete() { + $res = $this->evaluation->delete(); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + /** + * Delete all results for this evaluation + */ + + public function testdelete_results() { + $res = $this->evaluation->delete_results(); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + /** + * Delete this evaluation and all underlying results. + */ + + public function testdelete_with_results() { + $res = $this->evaluation->delete_with_results(); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + /** + * Check if an evaluation name (with the same parent category) already exists + * @param $name name to check (if not given, the name property of this object will be checked) + * @param $parent parent category + */ + + public function testdoes_name_exist() { + $name = 'test name'; + $parent = 1; + $res = $this->evaluation->does_name_exist($name, $parent); + $this->assertTrue(is_bool($res)); + //var_dump($res); + } + + /** + * Find evaluations by name + * @param string $name_mask search string + * @return array evaluation objects matching the search criterium + * @todo can be written more efficiently using a new (but very complex) sql query + */ + //problem with the call get_evaluations(): Call to a member function get_evaluations() on a non-object + /*public function testfind_evaluations() { + $name_mask = 'test name mask'; + $selectcat = 1; + $res = Evaluation::find_evaluations($name_mask,$selectcat); + $this->assertTrue(is_array($res)); + //var_dump($res); + }*/ + + public function testget_category_id() { + $res = $this->evaluation->get_category_id(); + $this->assertTrue(is_numeric($res)); + //var_dump($res); + } + + public function testget_course_code() { + $res = $this->evaluation->get_course_code(); + $this->assertTrue(is_string($res)); + //var_dump($res); + } + + public function testget_date() { + $res = $this->evaluation->get_date(); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testget_description() { + $res = $this->evaluation->get_description(); + $this->assertTrue(is_string($res)); + //var_dump($res); + } + + /** + * Retrieve evaluations where a student has results for + * and return them as an array of Evaluation objects + * @param $cat_id parent category (use 'null' to retrieve them in all categories) + * @param $stud_id student id + */ + + public function testget_evaluations_with_result_for_student() { + $stud_id = 1; + $res = $this->evaluation->get_evaluations_with_result_for_student($cat_id = null, $stud_id); + $this->assertTrue(is_array($res)); + //var_dump($res); + } + + public function testget_icon_name() { + $res = $this->evaluation->get_icon_name(); + $this->assertTrue(is_string($res)); + //var_dump($res); + } + + public function testget_id() { + $res = $this->evaluation->get_id(); + $this->assertTrue(is_numeric($res)); + //var_dump($res); + } + + public function testget_item_type() { + $res = $this->evaluation->get_item_type(); + $this->assertTrue(is_string($res)); + //var_dump($res); + } + + public function testget_max() { + $res = $this->evaluation->get_max(); + $this->assertTrue(is_numeric($res)); + //var_dump($res); + } + + public function testget_name() { + $res = $this->evaluation->get_name(); + $this->assertTrue(is_string($res)); + //var_dump($res); + } + + /** + * Get a list of students that do not have a result record for this evaluation + */ + + public function testget_not_subscribed_students() { + $res = $this->evaluation->get_not_subscribed_students($first_letter_user = ''); + $this->assertTrue(is_array($res)); + //var_dump($res); + } + + /** + * Generate an array of possible categories where this evaluation can be moved to. + * Notice: its own parent will be included in the list: it's up to the frontend + * to disable this element. + * @return array 2-dimensional array - every element contains 3 subelements (id, name, level) + */ + + public function testget_target_categories() { + $res = $this->evaluation->get_target_categories(); + $this->assertTrue(is_array($res)); + //var_dump($res); + } + + public function testget_user_id() { + $res = $this->evaluation->get_user_id(); + $this->assertTrue(is_numeric($res)); + //var_dump($res); + } + + public function testget_weight() { + $res = $this->evaluation->get_weight(); + $this->assertTrue(is_numeric($res)); + //var_dump($res); + } + + /** + * Are there any results for this evaluation yet ? + * The 'max' property should not be changed then. + */ + + public function testhas_results() { + $res = $this->evaluation->has_results(); + $this->assertTrue(is_bool($res)); + //var_dump($res); + } + + public function testis_valid_score() { + $score = 1; + $res = $this->evaluation->is_valid_score($score); + $this->assertTrue(is_bool($res)); + //var_dump($res); + } + + public function testis_visible() { + $res = $this->evaluation->is_visible(); + $this->assertTrue(is_numeric($res)); + //var_dump($res); + } + + /** + * Retrieve evaluations and return them as an array of Evaluation objects + * @param $id evaluation id + * @param $user_id user id (evaluation owner) + * @param $course_code course code + * @param $category_id parent category + * @param $visible visible + */ + + public function testload() { + $res = $this->evaluation->load($id = null, $user_id = null, $course_code = null, $category_id = null, $visible = null); + $this->assertTrue(is_array($res)); + //var_dump($res); + } + + /** + * Move this evaluation to the given category. + * If this evaluation moves from inside a course to outside, + * its course code is also changed. + */ + + public function testmove_to_cat() { + $cat = $this->evaluation; + $res = $this->evaluation->move_to_cat($cat); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + /** + * Update the properties of this evaluation in the database + */ + + public function testsave() { + $res = $this->evaluation->save(); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testset_category_id() { + $res = $this->evaluation->set_category_id(1); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testset_course_code() { + $res = $this->evaluation->set_course_code('COURSETEST'); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testset_date() { + global $date; + $res = $this->evaluation->set_date('02/02/2010'); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testset_description() { + $res = $this->evaluation->set_description('test description'); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testset_id() { + $res = $this->evaluation->set_id(1); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testset_max() { + $res = $this->evaluation->set_max(1); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testset_name() { + $res = $this->evaluation->set_name('test name'); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testset_user_id() { + $res = $this->evaluation->set_user_id(1); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testset_visible() { + $res = $this->evaluation->set_visible(1); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function testset_weight() { + $res = $this->evaluation->set_weight(1); + $this->assertTrue(is_null($res)); + //var_dump($res); + } + + public function __destruct() { + // The destructor acts like a global tearDown for the class + require_once api_get_path(SYS_TEST_PATH).'teardown.inc.php'; + } +} +?> From bc12e7f20cc16d8efcf3f18246ea8f1155cf54d3 Mon Sep 17 00:00:00 2001 From: Guillaume Viguier Date: Fri, 19 Feb 2010 15:07:18 -0500 Subject: [PATCH 3/4] Inconsistent results returned by api_get_user_info (see CT#572) --- main/inc/lib/main_api.lib.php | 98 +++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 39 deletions(-) diff --git a/main/inc/lib/main_api.lib.php b/main/inc/lib/main_api.lib.php index 1a121ff089..4597cf160c 100755 --- a/main/inc/lib/main_api.lib.php +++ b/main/inc/lib/main_api.lib.php @@ -789,6 +789,61 @@ function api_get_user_courses($userid, $fetch_session = true) { return $courses; } +/** + * Formats user information into a standard array + * + * @param array Non-standard user array + * @return array Standard user array + */ +function _api_format_user($user) { + $result = array(); + if (isset($user['firstname']) AND isset($user['lastname'])) { + $firstname = $user['firstname']; + $lastname = $user['lastname']; + } else if (isset($user['firstName']) AND isset($user['lastName'])) { + $firstname = $user['firstName']; + $lastname = $user['lastName']; + } + + $result['firstname'] = $firstname; + $result['lastname'] = $lastname; + + //Kept for historical reasons + $result['firstName'] = $firstname; + $result['lastName'] = $lastname; + + if(isset($user['email'])) { + $result['mail'] = $user['email']; + } else { + $result['mail'] = $user['mail']; + } + $result['picture_uri'] = $user['picture_uri']; + $result['user_id'] = intval($user['user_id']); + $result['official_code'] = $user['official_code']; + $result['status'] = $user['status']; + $result['auth_source'] = $user['auth_source']; + $result['username'] = $user['username']; + $result['theme'] = $user['theme']; + $result['language'] = $user['language']; + if (!isset($user['lastLogin']) AND !isset($user['last_login'])) { + require_once api_get_path(LIBRARY_PATH).'/tracking.lib.php'; + $timestamp = Tracking::get_last_connection_date($result['user_id'], false, true); + // Convert the timestamp back into a datetime + // NOTE: this timestamp has ALREADY been converted to the local timezone in the get_last_connection_date function + $last_login = date("Y-m-d H:i:s", $timestamp); + } else { + if (isset($user['lastLogin'])) { + $last_login = $user['lastLogin']; + } else { + $last_login = $user['last_login']; + } + } + $result['last_login'] = $last_login; + // Kept for historical reasons + $result['lastLogin'] = $last_login; + return $result; +} + /** * Find all the information about a user. If no paramater is passed you find all the information about the current user. * @param $user_id (integer): the id of the user @@ -799,33 +854,14 @@ function api_get_user_courses($userid, $fetch_session = true) { function api_get_user_info($user_id = '') { global $tbl_user; if ($user_id == '') { - return $GLOBALS['_user']; + return _api_format_user($GLOBALS['_user']); } $sql = "SELECT * FROM ".Database :: get_main_table(TABLE_MAIN_USER)." WHERE user_id='".Database::escape_string($user_id)."'"; $result = Database::query($sql); if (Database::num_rows($result) > 0) { $result_array = Database::fetch_array($result); - // this is done so that it returns the same array-index-names - // ideally the names of the fields of the user table are renamed so that they match $_user (or vice versa) - // $_user should also contain every field of the user table (except password maybe). This would make the - // following lines obsolete (and the code cleaner and slimmer !!! - - $user_info['firstname'] = $result_array['firstname']; - $user_info['lastname'] = $result_array['lastname']; - - //Kept for historical reasons - $user_info['firstName'] = $result_array['firstname']; - $user_info['lastName'] = $result_array['lastname']; - - $user_info['mail'] = $result_array['email']; - $user_info['picture_uri'] = $result_array['picture_uri']; - $user_info['user_id'] = $result_array['user_id']; - $user_info['official_code'] = $result_array['official_code']; - $user_info['status'] = $result_array['status']; - $user_info['auth_source'] = $result_array['auth_source']; - $user_info['username'] = $result_array['username']; - $user_info['theme'] = $result_array['theme']; - return $user_info; + return _api_format_user($result_array); + } return false; } @@ -843,23 +879,7 @@ function api_get_user_info_from_username($username = '') { $result = Database::query($sql); if (Database::num_rows($result) > 0) { $result_array = Database::fetch_array($result); - // this is done so that it returns the same array-index-names - // ideally the names of the fields of the user table are renamed so that they match $_user (or vice versa) - // $_user should also contain every field of the user table (except password maybe). This would make the - // following lines obsolete (and the code cleaner and slimmer !!! - $user_info['firstName'] = $result_array['firstname']; - $user_info['lastName'] = $result_array['lastname']; - $user_info['firstname'] = $result_array['firstname']; - $user_info['lastname'] = $result_array['lastname']; - $user_info['mail'] = $result_array['email']; - $user_info['picture_uri'] = $result_array['picture_uri']; - $user_info['user_id'] = $result_array['user_id']; - $user_info['official_code'] = $result_array['official_code']; - $user_info['status'] = $result_array['status']; - $user_info['auth_source'] = $result_array['auth_source']; - $user_info['username'] = $result_array['username']; - $user_info['theme'] = $result_array['theme']; - return $user_info; + return _api_format_user($result_array); } return false; } From 78a2dc81483c8e12910780d8a92dc2be5bc3300a Mon Sep 17 00:00:00 2001 From: Ivan Tcholakov Date: Fri, 19 Feb 2010 23:53:32 +0200 Subject: [PATCH 4/4] Feature #272 - Changing a default value ISO-8859-15 ---> UTF-8 in the global initialization script. --- main/inc/global.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/inc/global.inc.php b/main/inc/global.inc.php index 0b128ab927..ee82a9871e 100755 --- a/main/inc/global.inc.php +++ b/main/inc/global.inc.php @@ -136,7 +136,7 @@ while ($row = @Database::fetch_array($result)) { $charset = $row[0]; } if (empty($charset)) { - $charset = 'ISO-8859-15'; + $charset = 'UTF-8'; } // Preserving the value of the global variable $charset. $charset_initial_value = $charset;