예제 #1
0
 public function save_configuration($widget_id)
 {
     $widget = new Admin_widget();
     $widget->where_related('teacher', 'id', $this->usermanager->get_teacher_id());
     $widget->get_by_id((int) $widget_id);
     if ($widget->exists()) {
         try {
             $widget_class = $this->load->admin_widget($widget->widget_type, $widget->id, unserialize($widget->widget_config));
             $data = $this->input->post('configure');
             if ($widget_class->validateConfiguration($data)) {
                 $data_to_save = $widget_class->mergeConfiguration(unserialize($widget->widget_config), $data);
                 $widget->widget_config = serialize($data_to_save);
                 if ($widget->save()) {
                     $this->messages->add_message($this->lang->line('admin_widget_configure_message_save_success'), Messages::MESSAGE_TYPE_SUCCESS);
                     redirect(create_internal_url('admin_widget/configure/' . $widget_id));
                 } else {
                     $this->messages->add_message($this->lang->line('admin_widget_configure_message_save_error'), Messages::MESSAGE_TYPE_ERROR);
                     redirect(create_internal_url('admin_widget/configure/' . $widget_id));
                 }
             } else {
                 $this->configure($widget_id);
             }
         } catch (Exception $e) {
             $this->configure($widget_id);
         }
     } else {
         $this->configure($widget_id);
     }
 }
function smarty_function_internal_url($params, $template)
{
    if (isset($params['url'])) {
        $simple = FALSE;
        if (isset($params['simple']) && (is_bool($params['simple']) || is_numeric($params['simple']) || strtolower($params['simple']) === 'true')) {
            $simple = (bool) $params['simple'];
        }
        return create_internal_url($params['url'], $simple);
    }
    return '';
}
예제 #3
0
 public function show($controller, $topic, $idiom = NULL)
 {
     $file_path = $controller . '/' . $topic . '.html';
     $path = APPPATH . 'manual/' . (is_null($idiom) ? $this->lang->get_current_idiom() : $idiom) . '/' . $file_path;
     if (file_exists($path)) {
         $help_content = file_get_contents($path);
         $help_content_parsed = $this->parser->string_parse($help_content);
         $this->parser->parse('frontend/help/show.tpl', array('help_content' => $help_content_parsed));
     } else {
         $options = array();
         $dirs = scandir(APPPATH . 'manual');
         foreach ($dirs as $dir) {
             if ($dir !== '.' && $dir !== '..' && is_dir(APPPATH . 'manual/' . $dir)) {
                 if (file_exists(APPPATH . 'manual/' . $dir . '/' . $file_path)) {
                     $options[$dir] = create_internal_url('help/show/' . $controller . '/' . $topic . '/' . $dir);
                 }
             }
         }
         $this->parser->parse('frontend/help/show_error.tpl', array('options' => $options));
     }
 }
예제 #4
0
 /**
  * Main constructor, initialise controller.
  * Database will be connected, libraries for usermanager and messages will be loaded and translations model will be loaded.
  * All user data will be send to smarty template.
  */
 public function __construct()
 {
     parent::__construct();
     $this->load->config('list');
     $this->load->config('lockdown');
     if ($this->config->item('system_lockdown') === TRUE) {
         if (!$this->input->is_ajax_request()) {
             redirect(create_internal_url('maintenance', TRUE));
         }
         die;
     }
     if ($this->input->is_cli_request()) {
         echo 'Error: You can\'t call this controller from CLI!';
         die;
     }
     $this->load->database();
     $this->load->library('usermanager');
     $this->load->library('messages');
     $this->load->model('translations');
     $this->usermanager->set_student_data_to_smarty();
     $this->usermanager->set_teacher_data_to_smarty();
 }
예제 #5
0
 public function select_group()
 {
     $group_id = $this->input->post('group_id');
     $this->_transaction_isolation();
     $this->db->trans_begin();
     $group = new Group();
     $group->get_by_id($group_id);
     if ($group->exists()) {
         $course = $group->course->get();
         if (is_null($course->groups_change_deadline) || date('U', strtotime($course->groups_change_deadline)) >= time()) {
             $student = new Student();
             $student->get_by_id($this->usermanager->get_student_id());
             if ($student->is_related_to('active_course', $course->id)) {
                 $participant = new Participant();
                 $participant->where_related($student);
                 $participant->where_related($course);
                 $participant->where('allowed', 1);
                 $participant->get();
                 if ($participant->exists()) {
                     if (!$participant->is_related_to($group)) {
                         $participant->save($group);
                         $participant->where_related($course);
                         $participant->where_related($group);
                         $participant->where('allowed', 1);
                         $participants_count = $participant->count();
                         $room = new Room();
                         $room->where_related($group)->order_by('capacity', 'asc')->limit(1)->get();
                         if ($participants_count > intval($room->capacity)) {
                             $this->db->trans_rollback();
                             $this->messages->add_message('lang:groups_message_group_is_full', Messages::MESSAGE_TYPE_ERROR);
                         } else {
                             $this->db->trans_commit();
                             $this->messages->add_message(sprintf($this->lang->line('groups_message_group_changed'), $this->lang->text($group->name)), Messages::MESSAGE_TYPE_SUCCESS);
                             $this->_action_success();
                             $this->output->set_internal_value('course_id', $participant->course_id);
                         }
                     } else {
                         $this->db->trans_rollback();
                         $this->messages->add_message('lang:groups_message_you_are_in_group', Messages::MESSAGE_TYPE_ERROR);
                     }
                 } else {
                     $this->db->trans_rollback();
                     $this->messages->add_message('lang:groups_message_cant_found_participant_record', Messages::MESSAGE_TYPE_ERROR);
                 }
             } else {
                 $this->db->trans_rollback();
                 $this->messages->add_message('lang:groups_message_cant_change_group_of_inactive_course', Messages::MESSAGE_TYPE_ERROR);
             }
         } else {
             $this->db->trans_rollback();
             $this->messages->add_message('lang:groups_message_groups_switching_disabled', Messages::MESSAGE_TYPE_ERROR);
         }
     } else {
         $this->db->trans_rollback();
         $this->messages->add_message('lang:groups_message_group_not_found', Messages::MESSAGE_TYPE_ERROR);
     }
     redirect(create_internal_url('groups'));
 }
예제 #6
0
 public function post_comment_reply($task_id, $comment_id)
 {
     $this->usermanager->student_login_protected_redirect();
     $this->create_comment();
     redirect(create_internal_url('tasks/reply_at_comment/' . $task_id . '/' . $comment_id));
 }
예제 #7
0
 public function insert_to_task_set()
 {
     $this->load->library('form_validation');
     $task_set_id = intval($this->input->post('task_set_id'));
     $this->_transaction_isolation();
     $this->db->trans_begin();
     $task_set = new Task_set();
     $task_set->get_by_id($task_set_id);
     $this->form_validation->set_rules('task_id', 'task_id', 'required');
     $this->form_validation->set_rules('task_set_id', 'task_set_id', 'required');
     if ($task_set->exists()) {
         if ($task_set->content_type == 'task_set') {
             $this->form_validation->set_rules('points_total', 'lang:admin_tasks_add_to_task_set_form_field_points_total', 'required|number|greater_than_equal[0]');
             $this->form_validation->set_rules('test_max_points', 'lang:admin_tasks_add_to_task_set_form_field_test_max_points', 'required|number|greater_than_equal[0]');
             $this->form_validation->set_rules('test_min_points', 'lang:admin_tasks_add_to_task_set_form_field_test_min_points', 'required|number|less_than_field_or_equal[test_max_points]');
         } else {
             $this->form_validation->set_rules('max_projects_selections', 'lang:admin_tasks_add_to_task_set_form_field_max_projects_selections', 'required|integer|greater_than[0]');
         }
     }
     if ($this->form_validation->run()) {
         $task_id = intval($this->input->post('task_id'));
         $points_total = floatval($this->input->post('points_total'));
         $test_max_points = floatval($this->input->post('test_max_points'));
         $test_min_points = floatval($this->input->post('test_min_points'));
         $bonus_task = (int) (bool) intval($this->input->post('bonus_task'));
         $max_projects_selections = intval($this->input->post('max_projects_selections'));
         $internal_comment = $this->input->post('internal_comment');
         $task = new Task();
         $task->get_by_id($task_id);
         if (!$task->exists()) {
             $this->db->trans_rollback();
             $this->messages->add_message('lang:admin_tasks_error_message_task_not_found', Messages::MESSAGE_TYPE_ERROR);
         } elseif (!$task_set->exists()) {
             $this->db->trans_rollback();
             $this->messages->add_message('lang:admin_tasks_add_to_task_set_nothing_opened', Messages::MESSAGE_TYPE_ERROR);
         } elseif ($task_set->is_related_to($task)) {
             $this->db->trans_rollback();
             $this->messages->add_message('lang:admin_tasks_add_to_task_set_already_related', Messages::MESSAGE_TYPE_ERROR);
         } else {
             $related_task = $task_set->task->include_join_fields()->order_by('join_sorting', 'desc')->limit(1)->get();
             $new_sorting = $related_task->exists() ? intval($related_task->join_sorting) + 1 : 1;
             $task_set->save($task);
             $task_set->set_join_field($task, 'points_total', $points_total);
             $task_set->set_join_field($task, 'test_max_points', $test_max_points);
             $task_set->set_join_field($task, 'test_min_points', $test_min_points);
             $task_set->set_join_field($task, 'sorting', $new_sorting);
             $task_set->set_join_field($task, 'bonus_task', $bonus_task);
             $task_set->set_join_field($task, 'max_projects_selections', $max_projects_selections);
             $task_set->set_join_field($task, 'internal_comment', $internal_comment);
             if ($this->db->trans_status()) {
                 $this->db->trans_commit();
                 $this->messages->add_message('lang:admin_tasks_add_to_task_set_save_success', Messages::MESSAGE_TYPE_SUCCESS);
                 $this->_action_success();
             } else {
                 $this->db->trans_rollback();
                 $this->messages->add_message('lang:admin_tasks_add_to_task_set_save_failed', Messages::MESSAGE_TYPE_ERROR);
             }
         }
         redirect(create_internal_url('admin_tasks/add_to_task_set/task_id/' . $task_id));
     } else {
         $this->db->trans_rollback();
         $this->add_to_task_set();
     }
 }
예제 #8
0
 public function delete_avatar()
 {
     $this->usermanager->student_login_protected_redirect();
     $student = new Student();
     $student->get_by_id($this->usermanager->get_student_id());
     $student->delete_avatar();
     $this->_action_success();
     redirect(create_internal_url('students/my_account'));
 }
예제 #9
0
 public function upload_solution($task_set_id_url, $task_id_url)
 {
     $task_set_id = url_get_id($task_set_id_url);
     $task_id = url_get_id($task_id_url);
     $this->_transaction_isolation();
     $this->db->trans_begin();
     $date = date('Y-m-d H:i:s');
     $student = new Student();
     $student->get_by_id($this->usermanager->get_student_id());
     $course = new Course();
     $course->where_related('active_for_student', 'id', $student->id);
     $course->where_related('participant', 'student_id', $student->id);
     $course->where_related('participant', 'allowed', 1);
     $course->include_related('period', 'name');
     $course->get();
     $task_set = new Task_set();
     $task_set->where_related($course);
     $task_set->where('published', 1);
     $task_set->group_start();
     $task_set->where('publish_start_time <=', $date);
     $task_set->or_where('publish_start_time', NULL);
     $task_set->group_end();
     $task_set->get_by_id($task_set_id);
     $task = $task_set->task->include_join_fields()->get_by_id($task_id);
     $project_selection = new Project_selection();
     $project_selection->where_related($student);
     $project_selection->where_related($task_set);
     $project_selection->where_related($task);
     $project_selection->get();
     if ($student->exists() && $course->exists() && $task_set->exists() && $task->exists() && $project_selection->exists()) {
         if ($date <= $task_set->upload_end_time) {
             $config['upload_path'] = 'private/uploads/solutions/task_set_' . intval($task_set_id) . '/';
             $config['allowed_types'] = 'zip';
             $config['max_size'] = intval($this->config->item('maximum_solition_filesize'));
             $current_version = $task_set->get_student_file_next_version($student->id);
             $config['file_name'] = $student->id . '_' . $this->normalize_student_name($student) . '_' . substr(md5(time() . rand(-500000, 500000)), 0, 4) . '_' . $current_version . '.zip';
             @mkdir($config['upload_path'], DIR_READ_MODE);
             $this->load->library('upload', $config);
             if ($this->upload->do_upload('file')) {
                 $solution = new Solution();
                 $solution->where('task_set_id', $task_set->id);
                 $solution->where('student_id', $student->id);
                 $solution->get();
                 $revalidate = 1;
                 if ($solution->exists()) {
                     $solution->ip_address = $_SERVER["REMOTE_ADDR"];
                     $solution->revalidate = $revalidate;
                     $solution->save();
                 } else {
                     $solution = new Solution();
                     $solution->ip_address = $_SERVER["REMOTE_ADDR"];
                     $solution->revalidate = $revalidate;
                     $solution->save(array('student' => $student, 'task_set' => $task_set));
                 }
                 $solution_version = new Solution_version();
                 $solution_version->ip_address = $_SERVER["REMOTE_ADDR"];
                 $solution_version->version = $current_version;
                 $solution_version->save($solution);
                 if ($this->db->trans_status()) {
                     $log = new Log();
                     $log->add_student_solution_upload_log(sprintf($this->lang->line('projects_task_solution_upload_log_message'), $config['file_name']), $student, $solution->id);
                     $this->db->trans_commit();
                     $this->messages->add_message('lang:projects_task_solution_uploaded', Messages::MESSAGE_TYPE_SUCCESS);
                     $this->_action_success();
                     $this->output->set_internal_value('task_set_id', $solution->task_set_id);
                     $this->output->set_internal_value('task_id', $task->id);
                 } else {
                     $this->db->trans_rollback();
                     @unlink($config['upload_path'] . $config['file_name']);
                     $this->messages->add_message('lang:projects_task_solution_canceled_due_db_error', Messages::MESSAGE_TYPE_ERROR);
                 }
                 redirect(create_internal_url('projects/task/' . $task_set_id_url . '/' . $task_id_url));
             } else {
                 $this->db->trans_rollback();
                 $this->parser->assign('file_error_message', $this->upload->display_errors('', ''));
                 $this->task($task_set_id_url, $task_id_url);
             }
         } else {
             $this->db->trans_rollback();
             $this->messages->add_message('lang:projects_task_solution_upload_time_error', Messages::MESSAGE_TYPE_ERROR);
             redirect(create_internal_url('projects/task/' . $task_set_id_url . '/' . $task_id_url));
         }
     } else {
         $this->db->trans_rollback();
         $this->messages->add_message('lang:projects_task_solution_database_data_wrong_error', Messages::MESSAGE_TYPE_ERROR);
         redirect(create_internal_url('projects/task/' . $task_set_id_url . '/' . $task_id_url));
     }
 }
예제 #10
0
 public function update_permission($task_set_id, $task_set_permission_id)
 {
     $this->load->library('form_validation');
     $this->form_validation->set_rules('task_set_permission[group_id]', 'lang:admin_task_sets_form_field_group_id', 'required');
     $task_set_permission_data = $this->input->post('task_set_permission');
     $this->form_validation->set_rules('task_set_permission[deadline_notification_emails_handler]', 'lang:admin_task_sets_form_field_deadline_notification_emails_handler', 'required');
     if (isset($task_set_permission_data['deadline_notification_emails_handler']) && $task_set_permission_data['deadline_notification_emails_handler'] == 2) {
         $this->form_validation->set_rules('task_set_permission[deadline_notification_emails]', 'lang:admin_task_sets_form_field_deadline_notification_emails', 'required|valid_emails');
     } else {
         $this->form_validation->set_rules('task_set_permission[deadline_notification_emails]', 'lang:admin_task_sets_form_field_deadline_notification_emails', 'zero_or_more_valid_emails');
     }
     if ($this->form_validation->run()) {
         $this->_transaction_isolation();
         $this->db->trans_begin();
         $task_set = new Task_set();
         $task_set->get_by_id((int) $task_set_id);
         $task_set_permission = new Task_set_permission();
         $task_set_permission->get_by_id((int) $task_set_permission_id);
         if ($task_set->exists() && !is_null($task_set->course_id)) {
             if ($task_set_permission->exists() && $task_set_permission->is_related_to($task_set)) {
                 $task_set_permission_upload_end_time = $task_set_permission->upload_end_time;
                 $task_set_permission->enabled = isset($task_set_permission_data['enabled']) ? 1 : 0;
                 $task_set_permission->group_id = $task_set_permission_data['group_id'];
                 $task_set_permission->room_id = intval($task_set_permission_data['room_id']) > 0 ? intval($task_set_permission_data['room_id']) : NULL;
                 $task_set_permission->publish_start_time = preg_match(Task_sets::REGEXP_PATTERN_DATETYME, $task_set_permission_data['publish_start_time']) ? $task_set_permission_data['publish_start_time'] : NULL;
                 $task_set_permission->upload_end_time = preg_match(Task_sets::REGEXP_PATTERN_DATETYME, $task_set_permission_data['upload_end_time']) ? $task_set_permission_data['upload_end_time'] : NULL;
                 $task_set_permission->deadline_notification_emails = $task_set_permission_data['deadline_notification_emails'];
                 $task_set_permission->deadline_notification_emails_handler = $task_set_permission_data['deadline_notification_emails_handler'];
                 if ($task_set_permission->upload_end_time !== $task_set_permission_upload_end_time) {
                     $task_set_permission->deadline_notified = 0;
                 }
                 if ($task_set_permission->save()) {
                     $task_set_permissions = new Task_set_permission();
                     $task_set_permissions->where_related($task_set);
                     $task_set_permissions->where('group_id', $task_set_permission->group_id);
                     if ($task_set_permissions->count() > 1) {
                         $this->db->trans_rollback();
                         $this->messages->add_message('lang:admin_task_set_permissions_error_message_cant_save_for_the_same_group', Messages::MESSAGE_TYPE_ERROR);
                     } else {
                         $this->db->trans_commit();
                         $this->messages->add_message('lang:admin_task_set_permissions_success_message_saved', Messages::MESSAGE_TYPE_SUCCESS);
                         $this->_action_success();
                     }
                 } else {
                     $this->db->trans_rollback();
                     $this->messages->add_message('lang:admin_task_set_permissions_error_message_cant_save', Messages::MESSAGE_TYPE_ERROR);
                 }
             } else {
                 $this->db->trans_rollback();
                 $this->messages->add_message('lang:admin_task_set_permissions_error_message_cant_find_task_set_permission_or_is_not_related_to_task_set', Messages::MESSAGE_TYPE_ERROR);
             }
         } else {
             $this->db->trans_rollback();
             $this->messages->add_message('lang:admin_task_set_permissions_error_message_cant_find_task_set_or_course', Messages::MESSAGE_TYPE_ERROR);
         }
         redirect(create_internal_url('admin_task_set_permissions/edit_permission/' . (int) $task_set_id) . '/' . (int) $task_set_permission_id);
     } else {
         $this->edit_permission($task_set_id, $task_set_permission_id);
     }
 }
예제 #11
0
 public function set_columns()
 {
     $this->_transaction_isolation();
     $this->db->trans_begin();
     $teacher = new Teacher();
     $teacher->get_by_id($this->usermanager->get_teacher_id());
     $teacher->widget_columns = (int) $this->input->post('widget_columns');
     if ($teacher->widget_columns >= 1 && $teacher->widget_columns <= 4) {
         if ($teacher->save()) {
             $widget = new Admin_widget();
             $widget->where_related('teacher', $teacher);
             $widget->where('column >', $teacher->widget_columns);
             $widget->limit(1);
             $widget->get();
             if ($widget->exists()) {
                 $widget->where('column', $teacher->widget_columns);
                 $widget->where_related('teacher', $teacher);
                 $widget->limit(1);
                 $widget->order_by('position', 'desc');
                 $widget->get();
                 $position = 1;
                 if ($widget->exists()) {
                     $position += $widget->position;
                 }
                 $widget->select('id');
                 $widget->where('column >', $teacher->widget_columns);
                 $widget->where_related('teacher', $teacher);
                 $widget->order_by('column', 'asc');
                 $widget->order_by('position', 'asc');
                 $widget->get();
                 $updates = TRUE;
                 foreach ($widget->all as $widget_to_update) {
                     $widget_to_update->column = $teacher->widget_columns;
                     $widget_to_update->position = $position;
                     if (!$widget_to_update->save()) {
                         $updates = FALSE;
                     } else {
                         $position++;
                     }
                 }
                 if ($updates) {
                     $this->db->trans_commit();
                     $this->messages->add_message($this->lang->line('admin_dashboard_message_columns_saved'), Messages::MESSAGE_TYPE_SUCCESS);
                 } else {
                     $this->db->trans_rollback();
                     $this->messages->add_message($this->lang->line('admin_dashboard_message_columns_save_fail'), Messages::MESSAGE_TYPE_ERROR);
                 }
             } else {
                 $this->db->trans_commit();
                 $this->messages->add_message($this->lang->line('admin_dashboard_message_columns_saved'), Messages::MESSAGE_TYPE_SUCCESS);
             }
         } else {
             $this->db->trans_rollback();
             $this->messages->add_message($this->lang->line('admin_dashboard_message_columns_save_fail'), Messages::MESSAGE_TYPE_ERROR);
         }
     } else {
         $this->db->trans_rollback();
         $this->messages->add_message($this->lang->line('admin_dashboard_message_columns_save_fail_count'), Messages::MESSAGE_TYPE_ERROR);
     }
     redirect(create_internal_url('admin_dashboard'));
 }
예제 #12
0
 public function clear_all_compiled()
 {
     $this->smarty->clearCompiledTemplate();
     $this->messages->add_message($this->lang->line('admin_settings_message_compiled_cleared'));
     redirect(create_internal_url('admin_settings'));
 }
예제 #13
0
 public function log_in_as_student()
 {
     $uri_data = $this->uri->ruri_to_assoc(3);
     if (isset($uri_data['student_id'])) {
         $student = new Student();
         $student->get_by_id((int) $uri_data['student_id']);
         if ($this->usermanager->force_student_login($student)) {
             $this->messages->add_message('lang:students_force_loged_in', Messages::MESSAGE_TYPE_SUCCESS);
             redirect(create_internal_url('/'));
         }
     }
     $this->messages->add_message('lang:admin_students_failed_to_force_login', Messages::MESSAGE_TYPE_ERROR);
     redirect(create_internal_url('admin_students'));
 }
예제 #14
0
 /**
  * This function will redirects browser to login page for teacher when no teacher is authentificated.
  * @param boolean $send_current_url if this is set to TRUE (default), current url will be encoded and sent to login page, so user will be redirected back to it after successful login.
  */
 public function teacher_login_protected_redirect($send_current_url = TRUE)
 {
     if (!$this->is_teacher_session_valid()) {
         $current_url = encode_for_url($this->clear_current_url());
         $redirects = $this->CI->config->item('login_redirects');
         $redirect_student = $send_current_url ? '/' . trim($redirects['teacher'], '/') . '/current_url/' . $current_url . '/' : '/' . trim($redirects['teacher'], '/') . '/';
         $this->CI->messages->keep_messages();
         redirect(create_internal_url($redirect_student));
         die;
     }
 }
예제 #15
0
 public function save_new_constant()
 {
     $this->load->library('form_validation');
     $this->form_validation->set_rules('translation[constant]', 'lang:admin_translationseditor_new_constant_field_constant', 'required|callback__valid_constant|callback__free_constant');
     $this->form_validation->set_message('_valid_constant', $this->lang->line('admin_translationseditor_new_constant_form_error_valid_constant'));
     $this->form_validation->set_message('_free_constant', $this->lang->line('admin_translationseditor_new_constant_form_error_free_constant'));
     if ($this->form_validation->run()) {
         $translation = $this->input->post('translation');
         $constant = $translation['constant'];
         $this->_transaction_isolation();
         $this->db->trans_begin();
         if (count($translation['text']) > 0) {
             foreach ($translation['text'] as $idiom => $text) {
                 $this->translations->save_translation($constant, $idiom, $text);
             }
         }
         if ($this->db->trans_status()) {
             $this->db->trans_commit();
             $this->messages->add_message($this->lang->line('admin_translationseditor_new_constant_message_added'), Messages::MESSAGE_TYPE_SUCCESS);
         } else {
             $this->db->trans_rollback();
             $this->messages->add_message($this->lang->line('admin_translationseditor_new_constant_message_save_failed'), Messages::MESSAGE_TYPE_ERROR);
         }
         redirect(create_internal_url('admin_translationseditor/new_constant'));
     } else {
         $this->new_constant();
     }
 }
예제 #16
0
 public function post_comment_reply($task_set_id, $reply_at_id)
 {
     $this->load->library('form_validation');
     $this->form_validation->set_rules('comment[text]', 'lang:admin_task_sets_comments_form_field_text', 'required_no_html');
     if ($this->form_validation->run()) {
         $this->add_comment($task_set_id, $reply_at_id);
         redirect(create_internal_url('admin_task_sets/reply_at_comment/' . $task_set_id . '/' . $reply_at_id));
     } else {
         $this->reply_at_comment($task_set_id, $reply_at_id);
     }
 }
예제 #17
0
 public function update_teacher()
 {
     $this->usermanager->teacher_login_protected_redirect();
     $this->load->library('form_validation');
     $teacher_id = intval($this->input->post('teacher_id'));
     $this->form_validation->set_rules('teacher[fullname]', 'lang:admin_teachers_list_form_field_fullname', 'required|max_length[255]');
     $this->form_validation->set_rules('teacher[email]', 'lang:admin_teachers_list_form_field_email', 'required|valid_email|callback__email_available[' . $teacher_id . ']');
     $this->form_validation->set_rules('teacher[password]', 'lang:admin_teachers_list_form_field_password', 'min_length_optional[6]|max_length_optional[20]');
     $this->form_validation->set_message('_email_available', $this->lang->line('admin_teachers_list_form_error_email_not_available'));
     $this->_transaction_isolation();
     $this->db->trans_begin();
     if ($this->form_validation->run()) {
         $teacher = new Teacher();
         $teacher->where('id !=', $this->usermanager->get_teacher_id())->get_by_id($teacher_id);
         if ($teacher->exists()) {
             $teacher_data = $this->input->post('teacher');
             $teacher->from_array($teacher_data, array('fullname', 'email'));
             if (isset($teacher_data['password']) && !empty($teacher_data['password'])) {
                 $teacher->password = sha1($teacher_data['password']);
             }
             if ($teacher->save() && $this->db->trans_status()) {
                 $this->db->trans_commit();
                 $this->messages->add_message('lang:admin_teachers_list_account_save_successful', Messages::MESSAGE_TYPE_SUCCESS);
                 $this->_action_success();
             } else {
                 $this->db->trans_rollback();
                 $this->messages->add_message('lang:admin_teachers_list_account_save_fail', Messages::MESSAGE_TYPE_ERROR);
             }
         } else {
             $this->db->trans_rollback();
             $this->messages->add_message('lang:admin_teachers_list_teacher_not_found', Messages::MESSAGE_TYPE_ERROR);
         }
         redirect(create_internal_url('admin_teachers/list_index'));
     } else {
         $this->edit_teacher();
     }
 }
예제 #18
0
 public function save_test_configuration($test_id)
 {
     $this->_transaction_isolation();
     $this->db->trans_begin();
     $test = new Test();
     $test->get_by_id(intval($test_id));
     if ($test->exists()) {
         $this->load->library('form_validation');
         $this->form_validation->set_rules('test[name]', 'lang:admin_tests_test_form_field_name', 'required');
         $this->form_validation->set_rules('test[timeout]', 'lang:admin_tests_test_form_field_timeout', 'required|greater_than_equal[100]');
         $valid = TRUE;
         $test_object = $this->load->test($test->type);
         try {
             $test_object->initialize($test);
             $valid = $test_object->validate_test_configuration();
         } catch (TestException $e) {
             $this->db->trans_rollback();
             $this->messages->add_message($e->getMessage(), Messages::MESSAGE_TYPE_ERROR);
             redirect(create_internal_url('admin_tests/configure_test/' . $test_id));
             die;
         }
         if ($this->form_validation->run() && $valid) {
             $test_data = $this->input->post('test');
             $test->name = $test_data['name'];
             $test->timeout = (int) $test_data['timeout'];
             $test->enabled = isset($test_data['enabled']) ? 1 : 0;
             $test->enable_scoring = isset($test_data['enable_scoring']) ? 1 : 0;
             $test->instructions = isset($test_data['instructions']) ? remove_base_url($test_data['instructions']) : '';
             $can_save = TRUE;
             try {
                 $config_data = is_array($this->input->post('configuration')) ? $this->input->post('configuration') : array();
                 $upload_data = array();
                 $can_save = $test_object->handle_uploads($upload_data);
                 $config_data = array_merge($config_data, $upload_data);
                 $test->configuration = serialize($test_object->prepare_test_configuration($config_data));
             } catch (TestException $e) {
                 $this->db->trans_rollback();
                 $this->messages->add_message($e->getMessage(), Messages::MESSAGE_TYPE_ERROR);
                 redirect(create_internal_url('admin_tests/configure_test/' . $test_id));
                 die;
             }
             if ($can_save) {
                 $overlay = $this->input->post('overlay');
                 if ($test->save() && $this->lang->save_overlay_array(remove_base_url_from_overlay_array($overlay, 'instructions')) && $this->db->trans_status()) {
                     $this->db->trans_commit();
                     $this->messages->add_message('lang:admin_tests_flash_message_configuration_saved', Messages::MESSAGE_TYPE_SUCCESS);
                     $this->_action_success();
                 } else {
                     $this->db->trans_rollback();
                     $this->messages->add_message('lang:admin_tests_flash_message_configuration_save_failed', Messages::MESSAGE_TYPE_SUCCESS);
                 }
                 redirect(create_internal_url('admin_tests/configure_test/' . $test_id));
             } else {
                 $this->db->trans_rollback();
                 $this->configure_test($test_id);
             }
         } else {
             $this->db->trans_rollback();
             $this->configure_test($test_id);
         }
     } else {
         $this->db->trans_rollback();
         redirect(create_internal_url('admin_tests/configure_test/' . $test_id));
     }
 }
예제 #19
0
 public function send_group_mail($group_id)
 {
     $group = new Group();
     $group->get_by_id($group_id);
     if ($group->exists()) {
         $this->load->library('form_validation');
         $this->form_validation->set_rules('group_mail[subject]', 'lang:admin_groups_group_email_form_field_subject', 'required');
         $this->form_validation->set_rules('group_mail[body]', 'lang:admin_groups_group_email_form_field_body', 'required_no_html');
         $this->form_validation->set_rules('group_mail[from]', 'lang:admin_groups_group_email_form_field_from', 'required');
         $this->form_validation->set_rules('group_mail[student][]', 'lang:admin_groups_group_email_form_field_students', 'required');
         if ($this->form_validation->run()) {
             $data = $this->input->post('group_mail');
             $students = new Student();
             $students->where_related('participant/group', 'id', $group->id);
             $students->where_related('participant/course', 'id', $group->course_id);
             $students->where_related('participant', 'allowed', 1);
             $students->where_in('id', $data['student']);
             $students->get();
             if ($students->exists()) {
                 $from = NULL;
                 $from_name = '';
                 $teacher = new Teacher();
                 $teacher->get_by_id($this->usermanager->get_teacher_id());
                 if ($data['from'] == 'me') {
                     $from = $teacher->email;
                     $from_name = $teacher->fullname;
                 }
                 $sender_copy = isset($data['sender_copy']) && $data['sender_copy'] == 1 ? TRUE : FALSE;
                 $sender_email = $teacher->email;
                 if ($this->_send_multiple_emails($students, $data['subject'], '{$data.body|add_base_url}', array('data' => $data), $from, $from_name, $sender_copy, $sender_email)) {
                     $this->messages->add_message('lang:admin_groups_group_email_success_sent', Messages::MESSAGE_TYPE_SUCCESS);
                 } else {
                     $this->messages->add_message('lang:admin_groups_group_email_error_send_failed', Messages::MESSAGE_TYPE_ERROR);
                 }
             } else {
                 $this->messages->add_message('lang:admin_groups_group_email_error_no_students_selected', Messages::MESSAGE_TYPE_ERROR);
             }
             redirect(create_internal_url('admin_groups/group_mail/' . $group_id));
         } else {
             $this->group_mail($group_id);
         }
     } else {
         $this->messages->add_message('lang:admin_groups_group_email_error_group_not_found', Messages::MESSAGE_TYPE_ERROR);
         redirect(create_internal_url('admin_groups/group_mail/' . $group_id));
     }
 }
예제 #20
0
 public function update()
 {
     $this->load->library('form_validation');
     $this->form_validation->set_rules('task_set_type[name]', 'lang:admin_task_set_types_form_field_name', 'required');
     $this->form_validation->set_rules('task_set_type_id', 'id', 'required');
     if ($this->form_validation->run()) {
         $task_set_type_id = intval($this->input->post('task_set_type_id'));
         $task_set_type = new Task_set_type();
         $task_set_type->get_by_id($task_set_type_id);
         if ($task_set_type->exists()) {
             $task_set_type_data = $this->input->post('task_set_type');
             $task_set_type->from_array($task_set_type_data, array('name'));
             $this->_transaction_isolation();
             $this->db->trans_begin();
             if ($task_set_type->save() && $this->db->trans_status()) {
                 $this->db->trans_commit();
                 $this->messages->add_message('lang:admin_task_set_types_flash_message_save_successful', Messages::MESSAGE_TYPE_SUCCESS);
                 $this->_action_success();
             } else {
                 $this->db->trans_rollback();
                 $this->messages->add_message('lang:admin_task_set_types_flash_message_save_failed', Messages::MESSAGE_TYPE_ERROR);
             }
         } else {
             $this->messages->add_message('lang:admin_task_set_types_error_task_set_type_not_found', Messages::MESSAGE_TYPE_ERROR);
         }
         redirect(create_internal_url('admin_task_set_types/index'));
     } else {
         $this->edit();
     }
 }
예제 #21
0
 public function update()
 {
     $this->load->library('form_validation');
     $period_id = intval($this->input->post('period_id'));
     $this->form_validation->set_rules('period_id', 'id', 'required');
     $this->form_validation->set_rules('period[name]', 'lang:admin_periods_form_field_name', 'required|callback__is_unique_name_not_in[' . $period_id . ']');
     $this->form_validation->set_message('_is_unique_name_not_in', $this->lang->line('admin_periods_form_error_message_is_unique_name_not_in'));
     if ($this->form_validation->run()) {
         $period = new Period();
         $period->get_by_id($period_id);
         if ($period->exists()) {
             $period_data = $this->input->post('period');
             $period->from_array($period_data, array('name'));
             $this->_transaction_isolation();
             $this->db->trans_begin();
             if ($period->save() && $this->db->trans_status()) {
                 $this->db->trans_commit();
                 $this->messages->add_message('lang:admin_periods_flash_message_save_successful', Messages::MESSAGE_TYPE_SUCCESS);
                 $this->_action_success();
             } else {
                 $this->db->trans_rollback();
                 $this->messages->add_message('lang:admin_periods_flash_message_save_failed', Messages::MESSAGE_TYPE_ERROR);
             }
         } else {
             $this->messages->add_message('lang:admin_periods_error_period_not_found', Messages::MESSAGE_TYPE_ERROR);
         }
         redirect(create_internal_url('admin_periods/index'));
     } else {
         $this->edit();
     }
 }
예제 #22
0
 public function download_solutions($task_set_id)
 {
     $task_set = new Task_set();
     $task_set->get_by_id((int) $task_set_id);
     if ($task_set->exists()) {
         $task_set->download_all_solutions();
     } else {
         $this->messages->add_message('lang:admin_solutions_solutions_download_unknown_task_set', Messages::MESSAGE_TYPE_ERROR);
         redirect(create_internal_url('admin_solutions'));
     }
 }
예제 #23
0
 public function add_participant()
 {
     $this->load->library('form_validation');
     $this->form_validation->set_rules('participant[course]', 'lang:admin_participants_form_field_course', 'required');
     $this->form_validation->set_rules('participant[students][]', 'lang:admin_participants_form_field_students', 'required');
     if ($this->form_validation->run()) {
         $this->_transaction_isolation();
         $this->db->trans_begin();
         $process_ok = TRUE;
         $participant_data = $this->input->post('participant');
         $course = new Course();
         $course->get_by_id(intval($participant_data['course']));
         $group = new Group();
         $group->get_by_id(intval(@$participant_data['group']));
         if (!$course->exists()) {
             $this->db->trans_rollback();
             $this->messages->add_message('lang:admin_participants_message_course_not_exists', Messages::MESSAGE_TYPE_ERROR);
             $process_ok = FALSE;
         }
         if ($process_ok && $course->exists()) {
             if ($group->exists() && !$group->is_related_to($course)) {
                 $this->db->trans_rollback();
                 $this->messages->add_message('lang:admin_participants_message_group_not_belongs_to_course', Messages::MESSAGE_TYPE_ERROR);
                 $process_ok = FALSE;
             }
         }
         $disapproved = 0;
         $added = 0;
         if ($process_ok) {
             foreach ($participant_data['students'] as $student_id) {
                 $student = new Student();
                 $student->where_related('participant/course', 'id', $course->id);
                 $student->get_by_id($student_id);
                 if ($student->exists()) {
                     continue;
                 }
                 $student->get_by_id($student_id);
                 $participant = new Participant();
                 $participant->allowed = intval(@$participant_data['allowed']);
                 $participant->save(array($student, $course, $group));
                 $added++;
                 if ($participant->allowed == 1) {
                     $disallowe_participant = FALSE;
                     if ($course->participant->where('allowed', 1)->count() > intval($course->capacity)) {
                         $disallowe_participant = TRUE;
                     }
                     if ($group->exists()) {
                         $group_for_test = new Group();
                         $rooms = $group_for_test->room;
                         $rooms->select_min('capacity');
                         $rooms->where('group_id', '${parent}.id', FALSE);
                         $group_for_test->select_subquery($rooms, 'group_capacity');
                         $group_for_test->include_related_count('participant');
                         $group_for_test->where_related_participant('allowed', 1);
                         $group_for_test->get_by_id(intval($group->id));
                         if ($group_for_test->exists()) {
                             if (intval($group_for_test->participant_count) > intval($group_for_test->group_capacity)) {
                                 $disallowe_participant = TRUE;
                             }
                         }
                     }
                     if ($disallowe_participant) {
                         $participant->allowed = 0;
                         $participant->save();
                         $disapproved++;
                     }
                 }
             }
         }
         if ($this->db->trans_status() && $process_ok) {
             $this->db->trans_commit();
             $info_approved = intval(@$participant_data['allowed']) == 1 ? $added - $disapproved : 0;
             $info_disappoved = intval(@$participant_data['allowed']) == 1 ? $disapproved : $added;
             $message = sprintf($this->lang->line('admin_participants_message_addition_successfull'), $info_approved, $info_disappoved);
             $this->messages->add_message($message, Messages::MESSAGE_TYPE_SUCCESS);
             $this->_action_success();
         } else {
             $this->db->trans_rollback();
             $this->messages->add_message('lang:admin_participants_messages_error_in_addition_transaction', Messages::MESSAGE_TYPE_ERROR);
         }
         redirect(create_internal_url('admin_participants/add_participant_form'));
     } else {
         $this->add_participant_form();
     }
 }
예제 #24
0
 public function update()
 {
     $this->load->library('form_validation');
     $this->form_validation->set_rules('category[name]', 'lang:admin_categories_form_field_category_name', 'required');
     $this->form_validation->set_rules('category[parent_id]', 'lang:admin_categories_form_field_parent_category', 'required');
     $this->form_validation->set_rules('category_id', 'id', 'required');
     if ($this->form_validation->run()) {
         $categori_id = $this->input->post('category_id');
         $category = new Category();
         $category->get_by_id($categori_id);
         if ($category->exists()) {
             $category_data = $this->input->post('category');
             $category->name = $category_data['name'];
             $this->_transaction_isolation();
             $this->db->trans_begin();
             $cansave = TRUE;
             if ($category_data['parent_id'] == 'root') {
                 $category->parent_id = NULL;
             } else {
                 $parent = new Category();
                 $parent->get_by_id(intval($category_data['parent_id']));
                 if (!$parent->exists()) {
                     $cansave = FALSE;
                 } else {
                     $category->parent_id = intval($category_data['parent_id']);
                 }
             }
             if ($cansave && $category->save() && $this->db->trans_status()) {
                 $this->db->trans_commit();
                 $this->messages->add_message('lang:admin_categories_flash_message_save_successful', Messages::MESSAGE_TYPE_SUCCESS);
             } else {
                 $this->db->trans_rollback();
                 $this->messages->add_message('lang:admin_categories_flash_message_save_failed', Messages::MESSAGE_TYPE_ERROR);
             }
         } else {
             $this->messages->add_message('lang:admin_categories_error_category_not_found', Messages::MESSAGE_TYPE_ERROR);
         }
         redirect(create_internal_url('admin_categories/index'));
     } else {
         $this->edit();
     }
 }
예제 #25
0
 public function download_solutions($course_id)
 {
     $course = new Course();
     $course->get_by_id((int) $course_id);
     if ($course->exists()) {
         $course->download_all_solutions();
     } else {
         $this->messages->add_message('lang:admin_courses_message_cant_download_solutions', Messages::MESSAGE_TYPE_ERROR);
         redirect(create_internal_url('admin_courses'));
     }
 }
예제 #26
0
 public function update($group_id)
 {
     $this->load->library('form_validation');
     $this->form_validation->set_rules('room[name]', 'lang:admin_rooms_form_field_name', 'required');
     $this->form_validation->set_rules('room[time_begin]', 'lang:admin_rooms_form_field_time_begin', 'required|callback__is_time');
     $this->form_validation->set_rules('room[time_end]', 'lang:admin_rooms_form_field_time_end', 'required|callback__is_time|callback__is_later_time');
     $this->form_validation->set_rules('room[time_day]', 'lang:admin_rooms_form_field_time_day', 'required|callback__is_day');
     $this->form_validation->set_rules('room[capacity]', 'lang:admin_rooms_form_field_capacity', 'required|integer|greater_than[0]');
     $this->form_validation->set_rules('room_id', 'room_id', 'required');
     $this->form_validation->set_message('_is_time', $this->lang->line('admin_rooms_form_error_message_is_time'));
     $this->form_validation->set_message('_is_day', $this->lang->line('admin_rooms_form_error_message_is_day'));
     $this->form_validation->set_message('_is_later_time', $this->lang->line('admin_rooms_form_error_message_is_later_time'));
     if ($this->form_validation->run()) {
         $room_id = intval($this->input->post('room_id'));
         $room = new Room();
         $room->get_by_id($room_id);
         if ($room->exists()) {
             $room_data = $this->input->post('room');
             $room->from_array($room_data, array('name', 'time_day'));
             $room->time_begin = $this->time_to_int($room_data['time_begin']);
             $room->time_end = $this->time_to_int($room_data['time_end']);
             $room->capacity = intval($room_data['capacity']);
             $this->_transaction_isolation();
             $this->db->trans_begin();
             if (trim($room_data['teachers_plain']) != '') {
                 $room->teachers_plain = trim($room_data['teachers_plain']);
             } else {
                 $room->teachers_plain = NULL;
             }
             $current_teachers = $room->teacher->get();
             $room->delete($current_teachers->all);
             $teachers = new Teacher();
             if (is_array($room_data['teachers']) && count($room_data['teachers'])) {
                 foreach ($room_data['teachers'] as $teacher_id) {
                     $teachers->or_where('id', $teacher_id);
                 }
                 $teachers->get();
             }
             if ($room->save(array($teachers->all)) && $this->db->trans_status()) {
                 $this->db->trans_commit();
                 $this->messages->add_message('lang:admin_rooms_flash_message_save_successful', Messages::MESSAGE_TYPE_SUCCESS);
                 $this->_action_success();
                 $room->group->get();
                 $this->output->set_internal_value('course_id', $room->group->course_id);
             } else {
                 $this->db->trans_rollback();
                 $this->messages->add_message('lang:admin_rooms_flash_message_save_failed', Messages::MESSAGE_TYPE_ERROR);
             }
         } else {
             $this->messages->add_message('lang:admin_rooms_error_room_not_found', Messages::MESSAGE_TYPE_ERROR);
         }
         redirect(create_internal_url('admin_rooms/index/' . $group_id));
     } else {
         $this->edit($group_id);
     }
 }
예제 #27
0
 public function update($restriction_id)
 {
     $this->load->library('form_validation');
     $this->form_validation->set_rules('restriction[ip_addresses]', 'lang:admin_restrictions_form_field_ip_addresses', 'required|callback__ip_addresses_validation');
     $this->form_validation->set_rules('restriction[start_time]', 'lang:admin_restrictions_form_field_start_time', 'required|datetime');
     $this->form_validation->set_rules('restriction[end_time]', 'lang:admin_restrictions_form_field_end_time', 'required|datetime|callback__time_compare');
     $this->form_validation->set_message('_ip_addresses_validation', $this->lang->line('admin_restrictions_form_validation_message_ip_addresses'));
     $this->form_validation->set_message('_time_compare', $this->lang->line('admin_restrictions_form_validation_message_time_compare'));
     if ($this->form_validation->run()) {
         $this->_transaction_isolation();
         $this->db->trans_begin();
         $restriction = new Restriction();
         $restriction->get_by_id((int) $restriction_id);
         if ($restriction->exists()) {
             $restriction->from_array($this->input->post('restriction'));
             if ($restriction->save() && $this->db->trans_status()) {
                 $this->db->trans_commit();
                 $this->messages->add_message($this->lang->line('admin_restrictions_flash_messages_update_successful'), Messages::MESSAGE_TYPE_SUCCESS);
                 $this->_action_success();
             } else {
                 $this->db->trans_rollback();
                 $this->messages->add_message($this->lang->line('admin_restrictions_flash_messages_update_failed'), Messages::MESSAGE_TYPE_ERROR);
             }
         } else {
             $this->db->trans_rollback();
             $this->messages->add_message($this->lang->line('admin_restrictions_error_message_restriction_not_found'), Messages::MESSAGE_TYPE_ERROR);
         }
         redirect(create_internal_url('admin_restrictions'));
     } else {
         $this->edit($restriction_id);
     }
 }