public function test_result($test_queue_id) { $this->usermanager->student_login_protected_redirect(); $this->parser->add_css_file('frontend_tasks.css'); $test_queue = new Test_queue(); $test_queue->where_related('student', 'id', $this->usermanager->get_student_id()); $test_queue->include_related('task_set'); $test_queue->include_related('task_set/course'); $test_queue->include_related('task_set/course/period'); $test_queue->get_by_id((int) $test_queue_id); $tasks = new Task(); if ($test_queue->exists()) { $tasks->distinct(); $tasks->where_related('task_set', 'id', $test_queue->task_set_id); $tasks->order_by('task_task_set_rel.sorting', 'asc'); $tasks->get_iterated(); $tests = $test_queue->test->include_join_fields()->order_by('id', 'asc')->get_iterated(); $tests_per_task = array(); $overlays_tests = array(); foreach ($tests as $test) { $test_line = array('id' => $test->id, 'name' => $test->name, 'task_id' => $test->task_id, 'result' => $test->join_result, 'result_text' => $test->join_result_text, 'percent_points' => $test->join_percent_points, 'percent_bonus' => $test->join_percent_bonus, 'points' => $test->join_points, 'bonus' => $test->join_bonus, 'evaluation_table' => is_null($test->join_evaluation_table) ? array() : unserialize($test->join_evaluation_table)); $overlays_tests[] = $test->id; $tests_per_task[$test->task_id][] = $test_line; } $this->lang->init_overlays('tests', $overlays_tests, array('name')); $this->parser->assign('tests_per_task', $tests_per_task); } $this->load->helper('tests'); $test_types = get_all_supported_test_types(); $this->parser->parse('frontend/tasks/test_result.tpl', array('test_queue' => $test_queue, 'tasks' => $tasks, 'test_types' => $test_types)); }
public function aging() { $max_ticks = (int) $this->config->item('test_aging_ticks_to_priority_increase'); $max_raising = (int) $this->config->item('test_aging_max_tests_to_raise_priority'); $max_lifetime = (int) $this->config->item('test_queue_done_error_lifetime'); $max_lifetime = $max_lifetime < 60 ? 60 : $max_lifetime; $old_test_queue = new Test_queue(); $old_test_queue->where('status >=', 2); $old_test_queue->where('finish + INTERVAL ' . $max_lifetime . ' MINUTE < NOW()', NULL, TRUE); $old_test_queue->get(); $old_test_queue->delete_all(); if ($max_ticks < 10) { $max_ticks = 10; } if ($max_raising <= 0) { $max_raising = 1; } $this->db->query('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;'); $this->db->trans_start(); $tests_queue = new Test_queue(); $tests_queue->distinct(); $tests_queue->select('priority'); $tests_queue->order_by('priority', 'asc'); $tests_queue->where('status', 0); $tests_queue->where('worker', NULL); $tests_queue->get_iterated(); $priorities = array(); foreach ($tests_queue as $test_queue) { $priorities[] = (int) $test_queue->priority; } if (count($priorities) >= 2) { unset($priorities[0]); foreach ($priorities as $priority) { if ($priority <= 1) { continue; } $tests_with_max_ticks = new Test_queue(); $tests_with_max_ticks->where('age >=', $max_ticks); $tests_with_max_ticks->where('status', 0); $tests_with_max_ticks->where('worker', NULL); $tests_with_max_ticks->where('priority', $priority); $tests_with_max_ticks->order_by('start', 'asc'); $tests_with_max_ticks->limit($max_raising); $tests_with_max_ticks->get_iterated(); if ($tests_with_max_ticks->exists()) { foreach ($tests_with_max_ticks as $test_with_max_ticks) { $test_with_max_ticks->priority = $priority - 1; $test_with_max_ticks->age = 0; $test_with_max_ticks->save(); } $tests_queue_with_priority = new Test_queue(); $tests_queue_with_priority->where('status', 0); $tests_queue_with_priority->where('worker', NULL); $tests_queue_with_priority->where('priority', $priority); $tests_queue_with_priority->update('age', '0', FALSE); continue; } $tests_queue_with_priority = new Test_queue(); $tests_queue_with_priority->where('status', 0); $tests_queue_with_priority->where('worker', NULL); $tests_queue_with_priority->where('priority', $priority); $tests_queue_with_priority->update('age', 'age + 1', FALSE); } } $this->db->trans_complete(); }