public function do_upload_student_solution($solution_id) { $this->_transaction_isolation(); $this->db->trans_begin(); $solution = new Solution(); $solution->include_related('task_set', '*', TRUE, TRUE); $solution->include_related('student'); $solution->get_by_id((int) $solution_id); if ($solution->exists()) { if ($solution->task_set->exists()) { $allowed_file_types_array = trim($solution->task_set->allowed_file_types) != '' ? array_map('trim', explode(',', $solution->task_set->allowed_file_types)) : array(); $config['upload_path'] = 'private/uploads/solutions/task_set_' . intval($solution->task_set->id) . '/'; $config['allowed_types'] = 'zip' . (count($allowed_file_types_array) ? '|' . implode('|', $allowed_file_types_array) : ''); $config['max_size'] = intval($this->config->item('maximum_solition_filesize')); $config['file_name'] = $solution->student_id . '_' . $this->normalize_student_name($solution->student_fullname) . '_' . substr(md5(time() . rand(-500000, 500000)), 0, 4) . '_' . $solution->task_set->get_student_file_next_version($solution->student_id) . '.zip'; @mkdir($config['upload_path'], DIR_READ_MODE); $this->load->library('upload', $config); if ($this->upload->do_upload('upload')) { $upload_data = $this->upload->data(); $mimes = $this->upload->mimes_types('zip'); if (is_array($mimes) && !in_array($upload_data['file_type'], $mimes) || is_string($mimes) && $upload_data['file_type'] != $mimes) { if (!$this->zip_plain_file_to_archive($upload_data['full_path'], $upload_data['client_name'], $upload_data['file_path'])) { $this->messages->add_message('lang:admin_solutions_upload_cant_zip_file', Messages::MESSAGE_TYPE_ERROR); redirect(create_internal_url('admin_solutions/student_solution_upload/' . intval($solution_id))); die; } } $solution->revalidate = 1; $solution->save(); if ($this->db->trans_status()) { $log = new Log(); $log->add_teacher_solution_upload_log(sprintf($this->lang->line('admin_solutions_upload_log_message'), $config['file_name']), $this->usermanager->get_teacher_id(), $solution->student_id, $solution->id); $this->db->trans_commit(); $this->messages->add_message('lang:admin_solutions_upload_success', Messages::MESSAGE_TYPE_SUCCESS); $this->_action_success(); $this->output->set_internal_value('student_id', $solution->student_id); } else { $this->db->trans_rollback(); @unlink($config['upload_path'] . $config['file_name']); $this->messages->add_message('lang:admin_solutions_upload_failed', Messages::MESSAGE_TYPE_ERROR); } redirect(create_internal_url('admin_solutions/student_solution_upload/' . intval($solution_id))); } else { $this->db->trans_rollback(); $this->parser->assign('file_error_message', $this->upload->display_errors('', '')); $this->student_solution_upload($solution_id); } } else { $this->db->trans_rollback(); $this->messages->add_message('lang:admin_solutions_upload_task_set_not_found', Messages::MESSAGE_TYPE_ERROR); } } else { $this->db->trans_rollback(); $this->student_solution_upload($solution_id); } }
public function run_comparation() { $task_sets_setup_data = $this->input->post('task_sets_setup'); $solutions_data = $this->input->post('solutions'); $comparator_setup_data = $this->input->post('comparator_setup'); $course = new Course(); $course->get_by_id((int) $task_sets_setup_data['course']); $task_set = new Task_set(); $task_set->where_related($course); $task_set->get_by_id(isset($task_sets_setup_data['task_set']) ? (int) $task_sets_setup_data['task_set'] : 0); $this->parser->assign(array('course' => $course, 'task_set' => $task_set)); if ($course->exists() && $task_set->exists()) { $this->load->library('form_validation'); $this->form_validation->set_rules('solutions', 'lang:admin_comparator_list_solutions_form_field_solution_selection', 'callback__selected_solutions'); $this->form_validation->set_rules('comparator_setup[threshold]', 'lang:admin_comparator_list_solutions_form_field_threshold', 'required|numeric|greater_than_equal[0]|less_than_equal[1]'); $this->form_validation->set_rules('comparator_setup[min_tree_size]', 'lang:admin_comparator_list_solutions_form_field_min_tree_size', 'required|integer|greater_than_equal[1]'); $this->form_validation->set_rules('comparator_setup[max_cutted_tree_size]', 'lang:admin_comparator_list_solutions_form_field_max_cutted_tree_size', 'required|integer|greater_than_field_or_equal[comparator_setup[min_tree_size]]'); $this->form_validation->set_rules('comparator_setup[branching_factor]', 'lang:admin_comparator_list_solutions_form_field_branching_factor', 'required|integer|greater_than_equal[1]'); $this->form_validation->set_rules('comparator_setup[min_similarity]', 'lang:admin_comparator_list_solutions_form_field_minimum_similarity', 'required|numeric|greater_than_equal[0]|less_than_equal[1]'); $this->form_validation->set_rules('comparator_setup[timeout]', 'lang:admin_comparator_list_solutions_form_field_timeout', 'required|integer|greater_than_equal[1]'); $this->form_validation->set_message('_selected_solutions', $this->lang->line('admin_comparator_list_solutions_validation_callback_selected_solutions')); if ($this->form_validation->run()) { $solutions = new Solution(); $solutions->include_related('student'); $solutions->where_related($task_set); $solutions->order_by_related_as_fullname('student', 'fullname', 'asc'); $solutions->get_iterated(); $this->parser->assign('solutions', $solutions); $path = $this->get_random_hash_folder($course->id, $task_set->id); $path_source = $path . '/source'; $path_output = $path . '/output'; @mkdir($path_source, DIR_WRITE_MODE, TRUE); @mkdir($path_output, DIR_WRITE_MODE, TRUE); $all_extracted = TRUE; foreach ($solutions_data as $id => $config) { if (isset($config['selected']) && $config['selected'] == 1) { set_time_limit(120); $version = isset($config['version']) ? $config['version'] : 0; $student = isset($config['student']) ? $config['student'] : 0; $file = $task_set->get_student_files($student, $version); if (count($file) == 1) { $file = $file[$version]; $subdir = '/' . normalize($file['file_name']) . '_sid-' . $file['student_id'] . '_ver-' . $file['version']; $extract_path = $path_source . $subdir; @mkdir($extract_path, DIR_WRITE_MODE, TRUE); $status = $task_set->extract_student_zip_to_folder($file['file'], $extract_path, array('java')); $all_extracted = $all_extracted && $status; } } } if (!$all_extracted) { unlink_recursive($path, TRUE); } $this->parser->assign('all_extracted', $all_extracted); $this->parser->assign('path', $path); $this->parser->assign('comparator_config', array('t' => $comparator_setup_data['threshold'], 'm' => $comparator_setup_data['min_tree_size'], 'cut' => $comparator_setup_data['max_cutted_tree_size'], 'bf' => $comparator_setup_data['branching_factor'], 'mp' => $comparator_setup_data['min_similarity'], 'timeout' => $comparator_setup_data['timeout'] * 60000)); $this->parser->parse('backend/comparator/run_comparation.tpl'); } else { $this->list_solutions(); } } else { $this->list_solutions(); } }
public function run_comparation() { $task_sets_setup_data = $this->input->post('task_sets_setup'); $solutions_data = $this->input->post('solutions'); $moss_setup_data = $this->input->post('moss_setup'); $moss_base_files_data = $this->input->post('moss_base_files'); $course = new Course(); $course->get_by_id((int) $task_sets_setup_data['course']); $task_set = new Task_set(); $task_set->where_related($course); $task_set->get_by_id(isset($task_sets_setup_data['task_set']) ? (int) $task_sets_setup_data['task_set'] : 0); $this->config->load('moss'); $languages = $this->config->item('moss_langs_for_list'); asort($languages); $this->parser->assign(array('course' => $course, 'task_set' => $task_set, 'languages' => $languages)); $this->parser->assign('moss_enabled', $this->is_moss_user_id_set()); if ($course->exists() && $task_set->exists()) { $this->load->library('form_validation'); $this->form_validation->set_rules('solutions', 'lang:admin_moss_list_solutions_form_field_solution_selection', 'callback__selected_solutions'); $this->form_validation->set_rules('moss_setup[l]', 'lang:admin_moss_list_solutions_form_field_language', 'required'); $this->form_validation->set_rules('moss_setup[m]', 'lang:admin_moss_list_solutions_form_field_sensitivity', 'required|integer|greater_than[1]'); $this->form_validation->set_rules('moss_setup[n]', 'lang:admin_moss_list_solutions_form_field_matching_files', 'required|integer|greater_than[1]'); $this->form_validation->set_message('_selected_solutions', $this->lang->line('admin_moss_list_solutions_validation_callback_selected_solutions')); if ($this->form_validation->run() && $this->is_moss_user_id_set()) { $solutions = new Solution(); $solutions->include_related('student'); $solutions->where_related($task_set); $solutions->order_by_related_as_fullname('student', 'fullname', 'asc'); $solutions->get_iterated(); $this->parser->assign('solutions', $solutions); $tasks = new Task(); $tasks->where_related($task_set); $tasks->get_iterated(); $base_files_list = array(); foreach ($tasks as $task) { $base_files_list[$task->id] = array('task_id' => $task->id, 'task_name' => $this->lang->get_overlay_with_default('tasks', $task->id, 'name', $task->name), 'files' => $this->construct_base_files_for_task($task->id)); } $this->parser->assign('base_files_list', $base_files_list); $path = $this->get_random_hash_folder($course->id, $task_set->id); $path_source = $path . '/source'; $path_base = $path . '/base'; @mkdir($path_source, DIR_WRITE_MODE, TRUE); @mkdir($path_base, DIR_WRITE_MODE, TRUE); $all_extracted = TRUE; $moss_langs_extensions = $this->config->item('moss_langs_file_extensions'); if (isset($moss_langs_extensions[$moss_setup_data['l']])) { $file_extensions = $moss_langs_extensions[$moss_setup_data['l']]; } else { $all_extracted = FALSE; } foreach ($solutions_data as $id => $config) { if (!$all_extracted) { break; } if (isset($config['selected']) && $config['selected'] == 1) { set_time_limit(120); $version = isset($config['version']) ? $config['version'] : 0; $student = isset($config['student']) ? $config['student'] : 0; $file = $task_set->get_student_files($student, $version); if (count($file) == 1) { $file = $file[$version]; $subdir = '/' . normalize($file['file_name']) . '_sid-' . $file['student_id'] . '_ver-' . $file['version']; $extract_path = $path_source . $subdir; @mkdir($extract_path, DIR_WRITE_MODE, TRUE); $status = $task_set->extract_student_zip_to_folder($file['file'], $extract_path, $file_extensions); $all_extracted = $all_extracted && $status; } } } if (is_array($moss_base_files_data) && count($moss_base_files_data)) { foreach ($moss_base_files_data as $task_id => $path_array) { if (!$all_extracted) { break; } if (is_array($path_array) && count($path_array)) { foreach ($path_array as $path_hash => $file_path) { if (!$all_extracted) { break; } if (preg_match('/\\.zip(?P<indexNumberBox>\\[(?P<zipIndexNumber>[0-9]+)\\])$/', $file_path, $matches)) { $zipfile = mb_substr($file_path, 0, mb_strlen($file_path) - mb_strlen($matches['indexNumberBox'])); $zipindex = (int) $matches['zipIndexNumber']; $zip = new ZipArchive(); if ($zip->open($zipfile)) { set_time_limit(120); @mkdir($path_base . '/' . $task_id . '/' . $path_hash, DIR_WRITE_MODE, TRUE); if (!$zip->extractTo($path_base . '/' . $task_id . '/' . $path_hash, $zip->getNameIndex($zipindex))) { $all_extracted = FALSE; } $zip->close(); } else { $all_extracted = FALSE; } } else { set_time_limit(120); @mkdir($path_base . '/' . $task_id . '/' . $path_hash, DIR_WRITE_MODE, TRUE); $path_info = pathinfo($file_path); if (!copy($file_path, $path_base . '/' . $task_id . '/' . $path_hash . '/' . $path_info['basename'])) { $all_extracted = FALSE; } } } } } } if (!$all_extracted) { unlink_recursive($path, TRUE); } $this->parser->assign('all_extracted', $all_extracted); $this->parser->assign('path', $path); $this->parser->assign('moss_config', $moss_setup_data); $this->parser->parse('backend/moss/run_comparation.tpl'); } else { $this->list_solutions(); } } }
public function details($log_id) { $log = new Log(); $log->include_related('student'); $log->include_related('teacher'); $log->get_by_id($log_id); if ($log->exists()) { if ($log->log_type == Log::LOG_TYPE_STUDENT_SOLUTION_UPLOAD || $log->log_type == Log::LOG_TYPE_TEACHER_SOLUTION_UPLOAD) { $solution = new Solution(); $solution->include_related('student'); $solution->include_related('task_set'); $solution->include_related('task_set/course'); $solution->include_related('task_set/course/period'); $solution->get_by_id((int) $log->affected_row_primary_id); $this->parser->assign('solution', $solution); } elseif ($log->log_type == Log::LOG_TYPE_STUDENT_SOLUTION_DOWNLOAD) { $additional_data = unserialize($log->additional_data); $task_set = new Task_set(); $task_set->include_related('course'); $task_set->include_related('course/period'); $task_set->get_by_id(@$additional_data['task_set_id']); $this->parser->assign(array('task_set' => $task_set, 'filename' => @$additional_data['solution_file'])); } } $this->parser->add_css_file('admin_logs.css'); $this->parser->parse('backend/logs/details.tpl', array('log' => $log)); }