예제 #1
0
 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);
     }
 }
예제 #2
0
 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));
 }