private function get_module_map($auth_mode)
 {
     $lang = LangLoader::get('common', 'bugtracker');
     $config = BugtrackerConfig::load();
     $current_user = AppContext::get_current_user();
     $link = new SitemapLink($lang['module_title'], BugtrackerUrlBuilder::home(), Sitemap::FREQ_DEFAULT, Sitemap::PRIORITY_MAX);
     $module_map = new ModuleMap($link, 'bugtracker');
     if ($auth_mode == Sitemap::AUTH_PUBLIC) {
         $this_auth = Authorizations::check_auth(RANK_TYPE, User::VISITOR_LEVEL, $config->get_authorizations(), BugtrackerAuthorizationsService::READ_AUTHORIZATIONS);
     } else {
         if ($auth_mode == Sitemap::AUTH_USER) {
             if ($current_user->get_level() == User::ADMIN_LEVEL) {
                 $this_auth = true;
             } else {
                 $this_auth = Authorizations::check_auth(RANK_TYPE, $current_user->get_level(), $config->get_authorizations(), BugtrackerAuthorizationsService::READ_AUTHORIZATIONS);
             }
         }
     }
     if ($this_auth) {
         $module_map->add(new SitemapLink($lang['titles.unsolved'], BugtrackerUrlBuilder::unsolved()));
         $module_map->add(new SitemapLink($lang['titles.solved'], BugtrackerUrlBuilder::solved()));
         if ($config->is_roadmap_enabled() && $config->get_versions()) {
             $module_map->add(new SitemapLink($lang['titles.roadmap'], BugtrackerUrlBuilder::roadmap()));
         }
         $module_map->add(new SitemapLink($lang['titles.stats'], BugtrackerUrlBuilder::stats()));
     }
     return $module_map;
 }
 public function execute(HTTPRequestCustom $request)
 {
     $id = $request->get_int('id', 0);
     $page = $request->get_value('page', '');
     $filter = $request->get_value('filter', '');
     $filter_id = $request->get_value('filter_id', '');
     //Add filter
     BugtrackerService::add_filter(array('user_id' => AppContext::get_current_user()->get_id(), 'page' => $page, 'filters' => $filter, 'filters_ids' => $filter_id));
     AppContext::get_response()->redirect($request->get_url_referrer() ? $request->get_url_referrer() : BugtrackerUrlBuilder::unsolved(), LangLoader::get_message('success.add.filter', 'common', 'bugtracker'));
 }
 public function execute(HTTPRequestCustom $request)
 {
     AppContext::get_session()->csrf_get_protect();
     $this->init($request);
     $this->check_authorizations();
     $this->build_form($request);
     if ($this->submit_button->has_been_submited() && $this->form->validate()) {
         $this->save();
         AppContext::get_response()->redirect($this->form->get_value('referrer') ? $this->form->get_value('referrer') : BugtrackerUrlBuilder::unsolved(), StringVars::replace_vars(LangLoader::get_message('success.delete', 'common', 'bugtracker'), array('id' => $this->bug->get_id())));
     }
     $this->view->put('FORM', $this->form->display());
     return $this->build_response($this->view);
 }
    private function save()
    {
        $bug = $this->get_bug();
        if ($bug->get_id() === null) {
            $title = $this->form->get_value('title');
            $bug->set_title($title);
            $bug->set_rewrited_title(Url::encode_rewrite($title));
            $bug->set_contents($this->form->get_value('contents'));
            $bug->set_type($this->form->get_value('type') ? $this->form->get_value('type')->get_raw_value() : $this->config->get_default_type());
            $bug->set_category($this->form->get_value('category') ? $this->form->get_value('category')->get_raw_value() : $this->config->get_default_category());
            $bug->set_severity($this->form->get_value('severity') ? $this->form->get_value('severity')->get_raw_value() : $this->config->get_default_severity());
            $bug->set_priority($this->form->get_value('priority') ? $this->form->get_value('priority')->get_raw_value() : $this->config->get_default_priority());
            $bug->set_detected_in($this->form->get_value('detected_in') ? $this->form->get_value('detected_in')->get_raw_value() : $this->config->get_default_version());
            $bug->set_reproductible($this->form->get_value('reproductible') ? true : 0);
            if ($bug->is_reproductible()) {
                $bug->set_reproduction_method($this->form->get_value('reproduction_method'));
            }
            //Bug creation
            $bug->set_id(BugtrackerService::add($bug));
            if ($this->config->are_admin_alerts_enabled() && in_array($bug->get_severity(), $this->config->get_admin_alerts_levels())) {
                $alert = new AdministratorAlert();
                $alert->set_entitled('[' . $this->lang['module_title'] . '] ' . $bug->get_title());
                $alert->set_fixing_url(BugtrackerUrlBuilder::detail($bug->get_id() . '-' . $bug->get_rewrited_title())->relative());
                switch ($bug->get_priority()) {
                    case 1:
                        switch ($bug->get_severity()) {
                            case 1:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_VERY_LOW_PRIORITY;
                                break;
                            case 2:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_LOW_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                        }
                        break;
                    case 2:
                        switch ($bug->get_severity()) {
                            case 1:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_LOW_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                        }
                        break;
                    case 3:
                        switch ($bug->get_severity()) {
                            case 1:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_LOW_PRIORITY;
                                break;
                            case 2:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                            case 3:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_HIGH_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                        }
                        break;
                    case 4:
                        switch ($bug->get_severity()) {
                            case 2:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                            case 3:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_HIGH_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_LOW_PRIORITY;
                                break;
                        }
                        break;
                    case 5:
                        switch ($bug->get_severity()) {
                            case 2:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_HIGH_PRIORITY;
                                break;
                            case 3:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_VERY_HIGH_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                        }
                        break;
                    default:
                        switch ($bug->get_severity()) {
                            case 1:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_LOW_PRIORITY;
                                break;
                            case 2:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                            case 3:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_HIGH_PRIORITY;
                                break;
                            default:
                                $alert_priority = AdministratorAlert::ADMIN_ALERT_MEDIUM_PRIORITY;
                                break;
                        }
                        break;
                }
                $alert->set_priority($alert_priority);
                $alert->set_id_in_module($bug->get_id());
                $alert->set_type('bugtracker');
                AdministratorAlertService::save_alert($alert);
            }
        } else {
            $old_values = clone $bug;
            $now = new Date();
            $types = $this->config->get_types();
            $categories = $this->config->get_categories();
            $severities = $this->config->get_severities();
            $priorities = $this->config->get_priorities();
            $versions = $this->config->get_versions();
            $display_versions = count($versions) > 1;
            $status_list = $this->config->get_status_list();
            $common_lang = LangLoader::get('common');
            $title = $this->form->get_value('title', $old_values->get_title());
            $bug->set_title($title);
            $bug->set_rewrited_title(Url::encode_rewrite($title));
            $bug->set_contents($this->form->get_value('contents', $old_values->get_contents()));
            $bug->set_type($this->form->get_value('type') ? $this->form->get_value('type')->get_raw_value() : $old_values->get_type());
            $bug->set_category($this->form->get_value('category') ? $this->form->get_value('category')->get_raw_value() : $old_values->get_category());
            $bug->set_severity($this->form->get_value('severity') ? $this->form->get_value('severity')->get_raw_value() : $old_values->get_severity());
            $bug->set_priority($this->form->get_value('priority') ? $this->form->get_value('priority')->get_raw_value() : $old_values->get_priority());
            $bug->set_detected_in($this->form->get_value('detected_in') ? $this->form->get_value('detected_in')->get_raw_value() : $old_values->get_detected_in());
            $bug->set_reproductible($this->form->get_value('reproductible') ? true : 0);
            if ($bug->is_reproductible()) {
                $bug->set_reproduction_method($this->form->get_value('reproduction_method', $old_values->get_reproduction_method()));
            }
            $pm_comment = '';
            $modification = false;
            $fields = array('title', 'contents', 'type', 'category', 'severity', 'priority', 'detected_in', 'reproductible', 'reproduction_method');
            $n_values = $bug->get_properties();
            $o_values = $old_values->get_properties();
            foreach ($fields as $field) {
                if ($o_values[$field] != $n_values[$field]) {
                    $modification = true;
                    $comment = '';
                    switch ($field) {
                        case 'title':
                            $new_value = stripslashes($n_values[$field]);
                            $o_values[$field] = addslashes($o_values[$field]);
                            $comment = '';
                            break;
                        case 'contents':
                            $o_values[$field] = '';
                            $n_values[$field] = '';
                            $comment = $this->lang['notice.contents_update'];
                            break;
                        case 'reproduction_method':
                            $o_values[$field] = '';
                            $n_values[$field] = '';
                            $comment = $this->lang['notice.reproduction_method_update'];
                            break;
                        case 'type':
                            $new_value = !empty($n_values[$field]) ? stripslashes($types[$n_values[$field]]) : $this->lang['notice.none'];
                            break;
                        case 'category':
                            $new_value = !empty($n_values[$field]) ? stripslashes($categories[$n_values[$field]]) : $this->lang['notice.none_e'];
                            break;
                        case 'priority':
                            $new_value = !empty($n_values[$field]) ? stripslashes($priorities[$n_values[$field]]) : $this->lang['notice.none_e'];
                            break;
                        case 'severity':
                            $new_value = !empty($n_values[$field]) ? stripslashes($severities[$n_values[$field]]['name']) : $this->lang['notice.none'];
                            break;
                        case 'detected_in':
                            $new_value = !empty($n_values[$field]) ? stripslashes($versions[$n_values[$field]]['name']) : $this->lang['notice.none_e'];
                            break;
                        case 'status':
                            $new_value = $this->lang['status.' . $n_values[$field]];
                            break;
                        case 'reproductible':
                            $new_value = $n_values[$field] ? $common_lang['yes'] : $common_lang['no'];
                            break;
                        default:
                            $new_value = $n_values[$field];
                            $comment = '';
                    }
                    $pm_comment .= $field != 'contents' && $field != 'reproduction_method' ? $this->lang['labels.fields.' . $field] . ' : ' . stripslashes($new_value) . '
	' : '';
                    //Bug history update
                    BugtrackerService::add_history(array('bug_id' => $bug->get_id(), 'updater_id' => $this->current_user->get_id(), 'update_date' => $now->get_timestamp(), 'updated_field' => $field, 'old_value' => $o_values[$field], 'new_value' => $n_values[$field], 'change_comment' => $comment));
                }
            }
            if ($modification) {
                //Bug update
                BugtrackerService::update($bug);
                //Send PM to updaters if the option is enabled
                if ($this->config->are_pm_enabled() && $this->config->are_pm_edit_enabled() && !empty($pm_comment)) {
                    BugtrackerPMService::send_PM_to_updaters('edit', $bug->get_id(), $pm_comment);
                }
            }
        }
        Feed::clear_cache('bugtracker');
        BugtrackerStatsCache::invalidate();
        AppContext::get_response()->redirect($this->form->get_value('referrer') ? $this->form->get_value('referrer') : BugtrackerUrlBuilder::unsolved(), StringVars::replace_vars($this->is_new_bug ? $this->lang['success.add'] : $this->lang['success.edit'], array('id' => $bug->get_id())));
    }
 private function build_response(View $view)
 {
     $request = AppContext::get_request();
     $field = $request->get_value('field', 'date');
     $sort = $request->get_value('sort', 'desc');
     $page = $request->get_int('page', 1);
     $filter = $request->get_value('filter', '');
     $filter_id = $request->get_value('filter_id', '');
     $body_view = BugtrackerViews::build_body_view($view, 'unsolved');
     $response = new SiteDisplayResponse($body_view);
     $graphical_environment = $response->get_graphical_environment();
     $graphical_environment->set_page_title($this->lang['titles.unsolved'], $this->lang['module_title']);
     $graphical_environment->get_seo_meta_data()->set_canonical_url(BugtrackerUrlBuilder::unsolved($field, $sort, $page, $filter, $filter_id));
     $breadcrumb = $graphical_environment->get_breadcrumb();
     $breadcrumb->add($this->lang['module_title'], BugtrackerUrlBuilder::home());
     $breadcrumb->add($this->lang['titles.unsolved'], BugtrackerUrlBuilder::unsolved($field, $sort, $page, $filter, $filter_id));
     return $response;
 }
    private function build_versions_form($current_page, $requested_version, $filters, $filters_ids)
    {
        $search_field = $current_page == 'unsolved' ? 'detected_in' : 'fixed_in';
        if (in_array($search_field, $filters)) {
            $key = array_search($search_field, $filters);
            unset($filters[$key]);
            unset($filters_ids[$key]);
        }
        $filter = implode('-', $filters);
        $filter_id = implode('-', $filters_ids);
        $form = new HTMLForm('version-form', '', false);
        $fieldset = new FormFieldsetHorizontal('filter-version');
        $form->add_fieldset($fieldset);
        $fieldset->add_field(new FormFieldSimpleSelectChoice('filter_version', '', $requested_version, $this->build_select_versions($current_page), array('events' => array('change' => 'if (HTMLForms.getField("filter_version").getValue() > 0) {
				document.location = "' . ($current_page == 'unsolved' ? BugtrackerUrlBuilder::unsolved('name', 'desc', 1, (!empty($filter) ? $filter . '-' : '') . 'fixed_in', !empty($filter_id) ? $filter_id . '-' : '')->rel() : BugtrackerUrlBuilder::solved('name', 'desc', 1, (!empty($filter) ? $filter . '-' : '') . 'fixed_in', !empty($filter_id) ? $filter_id . '-' : '')->rel()) . '" + HTMLForms.getField("filter_version").getValue();
			} else {
				document.location = "' . ($current_page == 'unsolved' ? BugtrackerUrlBuilder::unsolved('name', 'desc', 1, $filter, $filter_id)->rel() : BugtrackerUrlBuilder::solved('name', 'desc', 1, $filter, $filter_id)->rel()) . '";
			}'))));
        return $form;
    }