Feature #7360 » default_custom_query_trunk_r15273.patch
| app/controllers/default_custom_query_setting_controller.rb | ||
|---|---|---|
| 1 |
# Redmine - project management software |
|
| 2 |
# Copyright (C) 2006-2015 Jean-Philippe Lang |
|
| 3 |
# |
|
| 4 |
# This program is free software; you can redistribute it and/or |
|
| 5 |
# modify it under the terms of the GNU General Public License |
|
| 6 |
# as published by the Free Software Foundation; either version 2 |
|
| 7 |
# of the License, or (at your option) any later version. |
|
| 8 |
# |
|
| 9 |
# This program is distributed in the hope that it will be useful, |
|
| 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 12 |
# GNU General Public License for more details. |
|
| 13 |
# |
|
| 14 |
# You should have received a copy of the GNU General Public License |
|
| 15 |
# along with this program; if not, write to the Free Software |
|
| 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 17 | ||
| 18 |
class DefaultCustomQuerySettingController < ApplicationController |
|
| 19 |
before_filter :find_project_by_project_id |
|
| 20 |
before_filter :authorize |
|
| 21 | ||
| 22 |
helper :default_custom_query |
|
| 23 | ||
| 24 |
def update |
|
| 25 |
settings = params[:settings] |
|
| 26 | ||
| 27 |
@default_query = ProjectsDefaultQuery.initialize_for(@project.id) |
|
| 28 |
@default_query.query_id = settings[:query_id] |
|
| 29 | ||
| 30 |
if @default_query.save |
|
| 31 |
session[:query] = nil |
|
| 32 |
end |
|
| 33 | ||
| 34 |
render partial: 'form' |
|
| 35 |
end |
|
| 36 |
end |
|
| app/controllers/issues_controller.rb | ||
|---|---|---|
| 24 | 24 |
before_filter :authorize, :except => [:index, :new, :create] |
| 25 | 25 |
before_filter :find_optional_project, :only => [:index, :new, :create] |
| 26 | 26 |
before_filter :build_new_issue_from_params, :only => [:new, :create] |
| 27 |
before_filter :with_default_query, only: [:index], if: :default_query_module_enabled? |
|
| 27 | 28 |
accept_rss_auth :index, :show |
| 28 | 29 |
accept_api_auth :index, :show, :create, :update, :destroy |
| 29 | 30 | |
| ... | ... | |
| 353 | 354 | |
| 354 | 355 |
private |
| 355 | 356 | |
| 357 |
def with_default_query |
|
| 358 |
case |
|
| 359 |
when params[:query_id].present? |
|
| 360 |
# Nothing to do |
|
| 361 |
when api_request? |
|
| 362 |
# Nothing to do |
|
| 363 |
# when show_all_issues? |
|
| 364 |
when params[:without_default] |
|
| 365 |
params[:set_filter] = 1 |
|
| 366 |
# when filter_applied? |
|
| 367 |
when params[:set_filter] && params.key?(:op) && params.key?(:f) |
|
| 368 |
# Nothing to do |
|
| 369 |
# when filter_cleared? |
|
| 370 |
when params[:set_filter] && [:op, :f].all? {|k| !params.key?(k) }
|
|
| 371 |
apply_default_query! |
|
| 372 |
when session[:query] |
|
| 373 |
query_id, project_id = session[:query].values_at(:id, :project_id) |
|
| 374 |
unless query_id && (project_id == @project.id) && IssueQuery.available_query?(@project.id, query_id) |
|
| 375 |
apply_default_query! |
|
| 376 |
end |
|
| 377 |
else |
|
| 378 |
apply_default_query! |
|
| 379 |
end |
|
| 380 |
end |
|
| 381 | ||
| 382 |
def apply_default_query! |
|
| 383 |
default_query = find_default_query |
|
| 384 |
if default_query |
|
| 385 |
params[:query_id] = default_query.id |
|
| 386 |
end |
|
| 387 |
end |
|
| 388 | ||
| 356 | 389 |
def retrieve_previous_and_next_issue_ids |
| 357 | 390 |
if params[:prev_issue_id].present? || params[:next_issue_id].present? |
| 358 | 391 |
@prev_issue_id = params[:prev_issue_id].presence.try(:to_i) |
| app/controllers/projects_controller.rb | ||
|---|---|---|
| 38 | 38 |
helper :queries |
| 39 | 39 |
helper :repositories |
| 40 | 40 |
helper :members |
| 41 |
helper :default_custom_query |
|
| 41 | 42 | |
| 42 | 43 |
# Lists visible projects |
| 43 | 44 |
def index |
| app/helpers/default_custom_query_helper.rb | ||
|---|---|---|
| 1 |
module DefaultCustomQueryHelper |
|
| 2 |
def options_for_selectable_queries(project) |
|
| 3 |
options_groups = [] |
|
| 4 | ||
| 5 |
queries = IssueQuery.only_public.where(project_id: nil) |
|
| 6 |
if queries.any? |
|
| 7 |
options_groups << [l('default_custom_query.label_queries_for_all_projects'), queries]
|
|
| 8 |
end |
|
| 9 | ||
| 10 |
queries = project.queries.only_public |
|
| 11 |
if queries.any? |
|
| 12 |
options_groups << [l('default_custom_query.label_queries_for_current_project'), queries]
|
|
| 13 |
end |
|
| 14 | ||
| 15 |
options_groups.map do |group, options| |
|
| 16 |
[group, options.collect {|o| [o.name, o.id] }]
|
|
| 17 |
end |
|
| 18 |
end |
|
| 19 |
end |
|
| app/helpers/projects_helper.rb | ||
|---|---|---|
| 27 | 27 |
{:name => 'wiki', :action => :manage_wiki, :partial => 'projects/settings/wiki', :label => :label_wiki},
|
| 28 | 28 |
{:name => 'repositories', :action => :manage_repository, :partial => 'projects/settings/repositories', :label => :label_repository_plural},
|
| 29 | 29 |
{:name => 'boards', :action => :manage_boards, :partial => 'projects/settings/boards', :label => :label_board_plural},
|
| 30 |
{:name => 'activities', :action => :manage_project_activities, :partial => 'projects/settings/activities', :label => :enumeration_activities}
|
|
| 30 |
{:name => 'activities', :action => :manage_project_activities, :partial => 'projects/settings/activities', :label => :enumeration_activities},
|
|
| 31 |
{:name => 'default_custom_query', :action => :manage_default_query, :partial => 'default_custom_query_setting/form', :label => :'default_custom_query.label_setting'}
|
|
| 31 | 32 |
] |
| 32 |
tabs.select {|tab| User.current.allowed_to?(tab[:action], @project)}
|
|
| 33 |
tabs = tabs.select {|tab| User.current.allowed_to?(tab[:action], @project)}
|
|
| 33 | 34 |
end |
| 34 | 35 | |
| 35 | 36 |
def parent_project_select_tag(project) |
| app/helpers/queries_helper.rb | ||
|---|---|---|
| 241 | 241 |
@query.project = @project |
| 242 | 242 |
end |
| 243 | 243 |
@query |
| 244 |
else |
|
| 245 |
@query = find_default_query |
|
| 244 | 246 |
end |
| 245 | 247 |
end |
| 246 | 248 | |
| 249 |
private |
|
| 250 | ||
| 251 |
def find_default_query |
|
| 252 |
@project.default_query if @project.is_a?(Project) |
|
| 253 |
end |
|
| 254 | ||
| 255 |
def default_query_module_enabled? |
|
| 256 |
@project && @project.module_enabled?(:default_custom_query) |
|
| 257 |
end |
|
| 258 | ||
| 247 | 259 |
# Returns the query definition as hidden field tags |
| 248 | 260 |
def query_as_hidden_field_tags(query) |
| 249 | 261 |
tags = hidden_field_tag("set_filter", "1", :id => nil)
|
| app/models/issue_query.rb | ||
|---|---|---|
| 16 | 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 17 | 17 | |
| 18 | 18 |
class IssueQuery < Query |
| 19 |
has_many :projects_default_queries, dependent: :nullify, foreign_key: :query_id |
|
| 19 | 20 | |
| 20 | 21 |
self.queried_class = Issue |
| 21 | 22 | |
| ... | ... | |
| 71 | 72 |
end |
| 72 | 73 |
} |
| 73 | 74 | |
| 75 |
scope :only_public, -> {
|
|
| 76 |
where(:visibility => VISIBILITY_PUBLIC) |
|
| 77 |
} |
|
| 78 | ||
| 79 |
def self.available_query?(project_id, query_id) |
|
| 80 |
self.only_public |
|
| 81 |
.where('project_id is null or project_id = ?', project_id)
|
|
| 82 |
.where(id: query_id).exists? |
|
| 83 |
end |
|
| 84 | ||
| 74 | 85 |
def initialize(attributes=nil, *args) |
| 75 | 86 |
super attributes |
| 76 | 87 |
self.filters ||= { 'status_id' => {:operator => "o", :values => [""]} }
|
| ... | ... | |
| 102 | 113 |
!is_private? |
| 103 | 114 |
end |
| 104 | 115 | |
| 116 |
def public_visibility? |
|
| 117 |
visibility == VISIBILITY_PUBLIC |
|
| 118 |
end |
|
| 119 | ||
| 105 | 120 |
def draw_relations |
| 106 | 121 |
r = options[:draw_relations] |
| 107 | 122 |
r.nil? || r == '1' |
| app/models/project.rb | ||
|---|---|---|
| 55 | 55 |
:class_name => 'IssueCustomField', |
| 56 | 56 |
:join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}",
|
| 57 | 57 |
:association_foreign_key => 'custom_field_id' |
| 58 |
# Default Custom Queries |
|
| 59 |
has_many :default_queries, dependent: :delete_all, :class_name => 'ProjectsDefaultQuery' |
|
| 58 | 60 | |
| 59 | 61 |
acts_as_attachable :view_permission => :view_files, |
| 60 | 62 |
:edit_permission => :manage_files, |
| ... | ... | |
| 790 | 792 |
end |
| 791 | 793 |
end |
| 792 | 794 | |
| 795 |
def default_query |
|
| 796 |
default_queries.first.try :query |
|
| 797 |
end |
|
| 798 | ||
| 799 |
def init_default_query |
|
| 800 |
default_queries.first || default_queries.new |
|
| 801 |
end |
|
| 802 | ||
| 793 | 803 |
private |
| 794 | 804 | |
| 795 | 805 |
def update_inherited_members |
| app/models/projects_default_query.rb | ||
|---|---|---|
| 1 |
# Redmine - project management software |
|
| 2 |
# Copyright (C) 2006-2015 Jean-Philippe Lang |
|
| 3 |
# |
|
| 4 |
# This program is free software; you can redistribute it and/or |
|
| 5 |
# modify it under the terms of the GNU General Public License |
|
| 6 |
# as published by the Free Software Foundation; either version 2 |
|
| 7 |
# of the License, or (at your option) any later version. |
|
| 8 |
# |
|
| 9 |
# This program is distributed in the hope that it will be useful, |
|
| 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 12 |
# GNU General Public License for more details. |
|
| 13 |
# |
|
| 14 |
# You should have received a copy of the GNU General Public License |
|
| 15 |
# along with this program; if not, write to the Free Software |
|
| 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 17 | ||
| 18 |
class ProjectsDefaultQuery < ActiveRecord::Base |
|
| 19 |
belongs_to :project |
|
| 20 |
belongs_to :query, class_name: 'IssueQuery' |
|
| 21 | ||
| 22 |
validates :project_id, :query_id, numericality: { allow_nil: true }
|
|
| 23 |
validates :project_id, uniqueness: true, presence: true |
|
| 24 |
validate :query_must_be_selectable |
|
| 25 | ||
| 26 |
def self.initialize_for(project_id) |
|
| 27 |
default_query = where(:project_id => project_id).first |
|
| 28 | ||
| 29 |
unless default_query |
|
| 30 |
default_query = self.new |
|
| 31 |
default_query.project_id = project_id |
|
| 32 |
end |
|
| 33 |
default_query |
|
| 34 |
end |
|
| 35 | ||
| 36 |
def query |
|
| 37 |
return unless super |
|
| 38 | ||
| 39 |
unless new_record? || selectable_query?(super) |
|
| 40 |
update_attribute :query_id, nil |
|
| 41 |
end |
|
| 42 |
super |
|
| 43 |
end |
|
| 44 | ||
| 45 |
private |
|
| 46 | ||
| 47 |
def query_must_be_selectable |
|
| 48 |
return if errors.any? || query_id.blank? || !query_id_changed? |
|
| 49 | ||
| 50 |
issue_query = IssueQuery.where(:id => query_id).first |
|
| 51 | ||
| 52 |
unless selectable_query?(issue_query) |
|
| 53 |
errors.add :query_id, :invalid |
|
| 54 |
end |
|
| 55 |
end |
|
| 56 | ||
| 57 |
def selectable_query?(query) |
|
| 58 |
query && query.public_visibility? && |
|
| 59 |
(query.project.nil? || query.project == project) |
|
| 60 |
end |
|
| 61 |
end |
|
| app/views/default_custom_query_setting/_form.html.erb | ||
|---|---|---|
| 1 |
<%= labelled_form_for @default_query ||= @project.init_default_query, |
|
| 2 |
as: :settings, |
|
| 3 |
url: default_custom_query_setting_update_path(@project), |
|
| 4 |
remote: true, method: :put, html: { id: 'default-query-setting' } do |f| %>
|
|
| 5 | ||
| 6 |
<%= error_messages_for @default_query %> |
|
| 7 | ||
| 8 |
<div class="box tabular"> |
|
| 9 |
<p> |
|
| 10 |
<%= f.select :query_id, options_for_selectable_queries(@project), include_blank: true %><br> |
|
| 11 |
<em><%=l 'default_custom_query.text_allowed_queries' %></em> |
|
| 12 |
</p> |
|
| 13 |
</div> |
|
| 14 |
<%= submit_tag l(:button_save) %> |
|
| 15 |
<% end %> |
|
| 16 | ||
| 17 |
<script> |
|
| 18 |
$('#default-query-setting').on('ajax:success', function(data, result, xhr) {
|
|
| 19 |
$('#tab-content-default_custom_query').html(result);
|
|
| 20 |
}); |
|
| 21 |
</script> |
|
| app/views/issues/_sidebar.html.erb | ||
|---|---|---|
| 1 | 1 |
<h3><%= l(:label_issue_plural) %></h3> |
| 2 | 2 | |
| 3 | 3 |
<ul> |
| 4 |
<li><%= link_to l(:label_issue_view_all), _project_issues_path(@project, :set_filter => 1) %></li> |
|
| 4 |
<% if @project && @project.module_enabled?(:default_custom_query) && @project.default_query.present? %> |
|
| 5 |
<li><%= link_to l('default_custom_query.label_view_default_issues'), project_issues_path(@project, :set_filter => 1) %><li>
|
|
| 6 |
<% end %> |
|
| 7 |
<li><%= link_to l(:label_issue_view_all), _project_issues_path(@project, :set_filter => 1, :without_default => 1) %></li> |
|
| 5 | 8 |
<% if @project %> |
| 6 | 9 |
<li><%= link_to l(:field_summary), project_issues_report_path(@project) %></li> |
| 7 | 10 |
<% end %> |
| config/locales/en.yml | ||
|---|---|---|
| 1181 | 1181 |
description_date_from: Enter start date |
| 1182 | 1182 |
description_date_to: Enter end date |
| 1183 | 1183 |
text_repository_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.' |
| 1184 |
|
|
| 1185 |
project_module_default_custom_query: Default custom query |
|
| 1186 |
permission_manage_default_query: Manage default query |
|
| 1187 | ||
| 1188 |
# Labels for projects_default_queries column |
|
| 1189 |
field_query: Default custom query |
|
| 1190 | ||
| 1191 |
default_custom_query: |
|
| 1192 |
label_setting: Default custom query |
|
| 1193 |
label_view_default_issues: View default issues |
|
| 1194 |
label_queries_for_all_projects: For all projects |
|
| 1195 |
label_queries_for_current_project: For current project |
|
| 1196 | ||
| 1197 |
text_allowed_queries: Public (to any users) queries only selectable |
|
| config/locales/fr.yml | ||
|---|---|---|
| 1201 | 1201 |
mail_body_security_notification_notify_enabled: Les notifications ont été activées pour l'adresse %{value}
|
| 1202 | 1202 |
mail_body_security_notification_notify_disabled: Les notifications ont été désactivées pour l'adresse %{value}
|
| 1203 | 1203 |
field_remote_ip: Adresse IP |
| 1204 | ||
| 1205 |
project_module_default_custom_query: Rapport par défaut |
|
| 1206 |
permission_manage_default_query: Gérer le rapport par défaut |
|
| 1207 | ||
| 1208 |
# Labels for projects_default_queries column |
|
| 1209 |
field_query: Rapport par défaut |
|
| 1210 | ||
| 1211 |
default_custom_query: |
|
| 1212 |
label_setting: Rapport par défaut |
|
| 1213 |
label_view_default_issues: Voir les demandes par défaut |
|
| 1214 |
label_queries_for_all_projects: Pour tous les projets |
|
| 1215 |
label_queries_for_current_project: Pour le projet en cours |
|
| 1216 | ||
| 1217 |
text_allowed_queries: Seuls les rapports publics (pour tous les utilisateurs) sont sélectionnables |
|
| config/locales/ja.yml | ||
|---|---|---|
| 1209 | 1209 |
receives notifications. |
| 1210 | 1210 |
mail_body_settings_updated: ! 'The following settings were changed:' |
| 1211 | 1211 |
field_remote_ip: IP address |
| 1212 | ||
| 1213 |
project_module_default_custom_query: デフォルトカスタムクエリ |
|
| 1214 |
permission_manage_default_query: デフォルトカスタムクエリの管理 |
|
| 1215 | ||
| 1216 |
# Labels for projects_default_queries column |
|
| 1217 |
field_query: デフォルトクエリ |
|
| 1218 | ||
| 1219 |
default_custom_query: |
|
| 1220 |
label_setting: デフォルトカスタムクエリ |
|
| 1221 |
label_view_default_issues: デフォルトチケット一覧を見る |
|
| 1222 |
label_queries_for_all_projects: 全プロジェクト向け |
|
| 1223 |
label_queries_for_current_project: 現在プロジェクト |
|
| 1224 | ||
| 1225 |
text_allowed_queries: 公開クエリ(すべてのユーザ)のみ選択可能 |
|
| config/locales/ru.yml | ||
|---|---|---|
| 1297 | 1297 |
receives notifications. |
| 1298 | 1298 |
mail_body_settings_updated: ! 'The following settings were changed:' |
| 1299 | 1299 |
field_remote_ip: IP address |
| 1300 | ||
| 1301 |
project_module_default_custom_query: Выбор запроса по умолчанию (фильтр задач) |
|
| 1302 |
permission_manage_default_query: Manage default query |
|
| 1303 | ||
| 1304 |
# Labels for projects_default_queries column |
|
| 1305 |
field_query: Выбор запроса по умолчанию |
|
| 1306 | ||
| 1307 |
default_custom_query: |
|
| 1308 |
label_setting: Выбор запроса по умолчанию |
|
| 1309 |
label_view_default_issues: Просматривать запросы по умолчанию |
|
| 1310 |
label_queries_for_all_projects: Для всех проектов |
|
| 1311 |
label_queries_for_current_project: Для текущего прооекта |
|
| 1312 | ||
| 1313 |
text_allowed_queries: Для выбора доступны только публичные запросы (фильтры задач) |
|
| config/locales/tr.yml | ||
|---|---|---|
| 1203 | 1203 |
receives notifications. |
| 1204 | 1204 |
mail_body_settings_updated: ! 'The following settings were changed:' |
| 1205 | 1205 |
field_remote_ip: IP address |
| 1206 | ||
| 1207 |
project_module_default_custom_query: Öntanımlı özel sorgu |
|
| 1208 |
permission_manage_default_query: Öntanımlı sorguyu yönet |
|
| 1209 | ||
| 1210 |
# Labels for projects_default_queries column |
|
| 1211 |
field_query: Öntanımlı özel sorgu |
|
| 1212 | ||
| 1213 |
default_custom_query: |
|
| 1214 |
label_setting: Öntanımlı özel sorgu |
|
| 1215 |
label_view_default_issues: Öntanımlı işleri gör |
|
| 1216 |
label_queries_for_all_projects: Tüm birimler için |
|
| 1217 |
label_queries_for_current_project: Simdiki birim için |
|
| 1218 | ||
| 1219 |
text_allowed_queries: Herkese açık (tüm kullanıcılar) sorgular sadece seçilebilir |
|
| config/routes.rb | ||
|---|---|---|
| 363 | 363 | |
| 364 | 364 |
match 'uploads', :to => 'attachments#upload', :via => :post |
| 365 | 365 | |
| 366 |
controller :default_custom_query_setting, as: 'default_custom_query_setting' do |
|
| 367 |
put ':project_id/default_custom_query/update', action: 'update', as: 'update' |
|
| 368 |
end |
|
| 369 | ||
| 366 | 370 |
get 'robots.txt', :to => 'welcome#robots' |
| 367 | 371 | |
| 368 | 372 |
Dir.glob File.expand_path("plugins/*", Rails.root) do |plugin_dir|
|
| config/settings.yml | ||
|---|---|---|
| 219 | 219 |
- boards |
| 220 | 220 |
- calendar |
| 221 | 221 |
- gantt |
| 222 |
- default_custom_query |
|
| 222 | 223 |
default_projects_tracker_ids: |
| 223 | 224 |
serialized: true |
| 224 | 225 |
default: |
| db/migrate/20160307180800_create_projects_default_queries.rb | ||
|---|---|---|
| 1 |
class CreateProjectsDefaultQueries < ActiveRecord::Migration |
|
| 2 |
def change |
|
| 3 |
create_table :projects_default_queries do |t| |
|
| 4 |
t.belongs_to :project |
|
| 5 |
t.belongs_to :query |
|
| 6 | ||
| 7 |
t.timestamps null: false |
|
| 8 |
end |
|
| 9 |
add_index :projects_default_queries, :project_id, unique: true |
|
| 10 |
add_index :projects_default_queries, :query_id |
|
| 11 |
end |
|
| 12 |
end |
|
| lib/redmine.rb | ||
|---|---|---|
| 183 | 183 |
map.project_module :gantt do |map| |
| 184 | 184 |
map.permission :view_gantt, {:gantts => [:show, :update]}, :read => true
|
| 185 | 185 |
end |
| 186 | ||
| 187 |
map.project_module :default_custom_query do |map| |
|
| 188 |
map.permission :manage_default_query, { :default_custom_query_setting => [:update] }, :require => :member
|
|
| 189 |
end |
|
| 186 | 190 |
end |
| 187 | 191 | |
| 188 | 192 |
Redmine::MenuManager.map :top_menu do |menu| |
| test/functional/default_custom_query_setting_controller.rb | ||
|---|---|---|
| 1 |
# Redmine - project management software |
|
| 2 |
# Copyright (C) 2006-2015 Jean-Philippe Lang |
|
| 3 |
# |
|
| 4 |
# This program is free software; you can redistribute it and/or |
|
| 5 |
# modify it under the terms of the GNU General Public License |
|
| 6 |
# as published by the Free Software Foundation; either version 2 |
|
| 7 |
# of the License, or (at your option) any later version. |
|
| 8 |
# |
|
| 9 |
# This program is distributed in the hope that it will be useful, |
|
| 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 12 |
# GNU General Public License for more details. |
|
| 13 |
# |
|
| 14 |
# You should have received a copy of the GNU General Public License |
|
| 15 |
# along with this program; if not, write to the Free Software |
|
| 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 17 | ||
| 18 |
require File.expand_path('../../test_helper', __FILE__)
|
|
| 19 | ||
| 20 |
class DefaultCustomQuerySettingControllerTest < ActionController::TestCase |
|
| 21 |
fixtures :projects, |
|
| 22 |
:users, |
|
| 23 |
:roles, |
|
| 24 |
:members, |
|
| 25 |
:member_roles, |
|
| 26 |
:issues |
|
| 27 | ||
| 28 |
def setup |
|
| 29 |
User.current = nil |
|
| 30 |
@request.session[:user_id] = nil |
|
| 31 | ||
| 32 |
@project = Project.generate_with_parent! |
|
| 33 |
@project.enable_module!(:default_custom_query) |
|
| 34 | ||
| 35 |
@permitted_user = User.generate! |
|
| 36 |
User.add_to_project(@permitted_user, @project, Role.generate!(:permissions => [:edit_project, :manage_default_query])) |
|
| 37 |
@not_permitted_user = User.generate! |
|
| 38 |
User.add_to_project(@not_permitted_user, @project, Role.generate!(:permissions => [:edit_project, :add_subprojects])) |
|
| 39 | ||
| 40 |
@stored_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project) |
|
| 41 |
@session_query_value = {:id => @stored_query.id, :project_id => @project.id}
|
|
| 42 |
@request.session[:query] = @session_query_value |
|
| 43 |
end |
|
| 44 | ||
| 45 |
def test_update_should_success_when_module_is_enabled_on_project_and_logged_user_has_permission |
|
| 46 |
public_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project) |
|
| 47 |
@request.session[:user_id] = @permitted_user.id |
|
| 48 | ||
| 49 |
xhr :put, :update, :project_id => @project.id, :settings => {:query_id => public_query.id}
|
|
| 50 | ||
| 51 |
assert_response :success |
|
| 52 |
assert_nil @request.session[:query] |
|
| 53 |
assert_template partial: 'default_custom_query_setting/_form' |
|
| 54 | ||
| 55 |
assert_equal public_query, @project.default_query |
|
| 56 |
end |
|
| 57 | ||
| 58 |
def test_update_should_success_and_clear_query_when_module_is_enabled_on_project_and_logged_user_has_permission |
|
| 59 |
@request.session[:user_id] = @permitted_user.id |
|
| 60 | ||
| 61 |
xhr :put, :update, :project_id => @project.id, :settings => {:query_id => nil}
|
|
| 62 | ||
| 63 |
assert_response :success |
|
| 64 |
assert_equal nil, @request.session[:query] |
|
| 65 |
assert_template partial: 'default_custom_query_setting/_form' |
|
| 66 | ||
| 67 |
assert_nil @project.default_query |
|
| 68 |
end |
|
| 69 | ||
| 70 |
def test_update_should_failure_when_module_is_enabled_on_project_but_logged_user_does_not_have_permission |
|
| 71 |
public_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project) |
|
| 72 |
@request.session[:user_id] = @not_permitted_user.id |
|
| 73 | ||
| 74 |
xhr :put, :update, :project_id => @project.identifier, :settings => {:query_id => public_query.id}
|
|
| 75 | ||
| 76 |
assert_response :forbidden |
|
| 77 |
assert_equal @session_query_value, @request.session[:query] |
|
| 78 |
end |
|
| 79 | ||
| 80 |
def test_update_should_failure_when_module_is_enabled_on_project_but_spacified_unselectable_query |
|
| 81 |
private_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => @project) |
|
| 82 |
@request.session[:user_id] = @permitted_user.id |
|
| 83 | ||
| 84 |
xhr :put, :update, :project_id => @project.id, :settings => {:query_id => private_query.id}
|
|
| 85 | ||
| 86 |
assert_response :success |
|
| 87 |
assert_equal @session_query_value, @request.session[:query] |
|
| 88 |
assert_template partial: 'default_custom_query_setting/_form' |
|
| 89 |
assert_select '#errorExplanation li', 1 |
|
| 90 |
end |
|
| 91 | ||
| 92 |
def test_update_should_failure_when_module_is_disabled |
|
| 93 |
@project.disable_module!(:default_custom_query) |
|
| 94 |
public_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project) |
|
| 95 |
@request.session[:user_id] = @permitted_user.id |
|
| 96 | ||
| 97 |
xhr :put, :update, :project_id => @project.id, :settings => {:query_id => public_query.id}
|
|
| 98 | ||
| 99 |
assert_response :forbidden |
|
| 100 |
assert_equal @session_query_value, @request.session[:query] |
|
| 101 |
end |
|
| 102 |
end |
|
| test/functional/issues_controller_test.rb | ||
|---|---|---|
| 431 | 431 |
assert_response :success |
| 432 | 432 |
end |
| 433 | 433 | |
| 434 |
def test_default_query_should_be_available_when_default_query_module_enabled |
|
| 435 |
project = Project.find(1) |
|
| 436 |
project.enable_module!(:default_custom_query) |
|
| 437 | ||
| 438 |
q = IssueQuery.create!(:name => "default_custom_query", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil) |
|
| 439 |
dq = ProjectsDefaultQuery.initialize_for(project.id) |
|
| 440 |
dq.query = q |
|
| 441 |
dq.save! |
|
| 442 | ||
| 443 |
@request.session[:user_id] = 3 |
|
| 444 | ||
| 445 |
get :index, :project_id => 1 |
|
| 446 |
assert_response :success |
|
| 447 |
assert_select 'h2', text: q.name |
|
| 448 |
assert_select 'ul.queries a.selected', text: q.name |
|
| 449 |
end |
|
| 450 | ||
| 451 |
def test_default_query_should_be_unavailable_when_default_query_module_disabled |
|
| 452 |
project = Project.find(1) |
|
| 453 |
project.disable_module!(:default_custom_query) |
|
| 454 | ||
| 455 |
@request.session[:user_id] = 3 |
|
| 456 | ||
| 457 |
get :index, :project_id => 1 |
|
| 458 |
assert_response :success |
|
| 459 |
assert_select 'h2', text: l(:label_issue_plural) |
|
| 460 |
assert_select 'ul.queries a.selected', false |
|
| 461 |
end |
|
| 462 | ||
| 463 |
def test_default_query_should_be_unavailable_when_param_without_default_spacified |
|
| 464 |
project = Project.find(1) |
|
| 465 |
project.enable_module!(:default_custom_query) |
|
| 466 | ||
| 467 |
q = IssueQuery.create!(:name => "default_custom_query", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil) |
|
| 468 |
dq = ProjectsDefaultQuery.initialize_for(project.id) |
|
| 469 |
dq.query = q |
|
| 470 |
dq.save! |
|
| 471 | ||
| 472 |
@request.session[:user_id] = 3 |
|
| 473 | ||
| 474 |
get :index, :project_id => 1, :without_default => 1 |
|
| 475 |
assert_response :success |
|
| 476 |
assert_select 'h2', text: l(:label_issue_plural) |
|
| 477 |
assert_select 'ul.queries a.selected', false |
|
| 478 |
end |
|
| 479 | ||
| 480 |
def test_default_query_should_be_unavailable_when_filter_condition_op_and_f_spacified |
|
| 481 |
project = Project.find(1) |
|
| 482 |
project.enable_module!(:default_custom_query) |
|
| 483 | ||
| 484 |
q = IssueQuery.create!(:name => "default_custom_query", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil) |
|
| 485 |
dq = ProjectsDefaultQuery.initialize_for(project.id) |
|
| 486 |
dq.query = q |
|
| 487 |
dq.save! |
|
| 488 | ||
| 489 |
@request.session[:user_id] = 3 |
|
| 490 | ||
| 491 |
get :index, :project_id => 1, :set_filter => 1, :op => 'op', :f => 'f' |
|
| 492 |
assert_response :success |
|
| 493 |
assert_select 'h2', text: l(:label_issue_plural) |
|
| 494 |
assert_select 'ul.queries a.selected', false |
|
| 495 |
end |
|
| 496 | ||
| 434 | 497 |
def test_index_should_omit_page_param_in_export_links |
| 435 | 498 |
get :index, :page => 2 |
| 436 | 499 |
assert_response :success |
| test/unit/helpers/default_custom_query_helper_test.rb | ||
|---|---|---|
| 1 |
# Redmine - project management software |
|
| 2 |
# Copyright (C) 2006-2015 Jean-Philippe Lang |
|
| 3 |
# |
|
| 4 |
# This program is free software; you can redistribute it and/or |
|
| 5 |
# modify it under the terms of the GNU General Public License |
|
| 6 |
# as published by the Free Software Foundation; either version 2 |
|
| 7 |
# of the License, or (at your option) any later version. |
|
| 8 |
# |
|
| 9 |
# This program is distributed in the hope that it will be useful, |
|
| 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 12 |
# GNU General Public License for more details. |
|
| 13 |
# |
|
| 14 |
# You should have received a copy of the GNU General Public License |
|
| 15 |
# along with this program; if not, write to the Free Software |
|
| 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 17 | ||
| 18 |
require File.expand_path('../../../test_helper', __FILE__)
|
|
| 19 | ||
| 20 |
class DefaultCustomQueryHelperTest < ActionView::TestCase |
|
| 21 |
include ApplicationHelper |
|
| 22 |
include DefaultCustomQueryHelper |
|
| 23 |
include Redmine::I18n |
|
| 24 |
include ERB::Util |
|
| 25 |
include Rails.application.routes.url_helpers |
|
| 26 | ||
| 27 |
fixtures :projects, :queries |
|
| 28 | ||
| 29 |
def setup |
|
| 30 |
super |
|
| 31 |
set_language_if_valid('en')
|
|
| 32 |
end |
|
| 33 | ||
| 34 |
def test_options_for_selectable_queries |
|
| 35 |
project = Project.find(2) |
|
| 36 | ||
| 37 |
options = options_for_selectable_queries(project) |
|
| 38 | ||
| 39 |
assert_equal 2, options.count |
|
| 40 |
assert_includes options.first, l('default_custom_query.label_queries_for_all_projects')
|
|
| 41 |
assert_includes options.first, IssueQuery.only_public.where(:project_id => nil).collect {|o| [o.name, o.id]}
|
|
| 42 |
assert_includes options.last, l('default_custom_query.label_queries_for_current_project')
|
|
| 43 |
assert_includes options.last, project.queries.only_public.collect {|o| [o.name, o.id]}
|
|
| 44 |
end |
|
| 45 |
end |
|
| test/unit/project_test.rb | ||
|---|---|---|
| 1000 | 1000 |
Project.uniq.visible.to_a |
| 1001 | 1001 |
end |
| 1002 | 1002 |
end |
| 1003 | ||
| 1004 |
def test_default_query |
|
| 1005 |
project = Project.find(1) |
|
| 1006 |
query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project) |
|
| 1007 |
ProjectsDefaultQuery.create!(:project_id => project.id, :query_id => query.id) |
|
| 1008 |
default_queries = ProjectsDefaultQuery.where(:project_id => project.id) |
|
| 1009 |
assert_equal query, project.default_query |
|
| 1010 |
end |
|
| 1011 | ||
| 1012 |
def test_init_default_query |
|
| 1013 |
project = Project.find(1) |
|
| 1014 |
query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project) |
|
| 1015 |
default_query = ProjectsDefaultQuery.create!(:project_id => project.id, :query_id => query.id) |
|
| 1016 |
assert_equal default_query, project.init_default_query |
|
| 1017 | ||
| 1018 |
default_query.destroy! |
|
| 1019 |
assert_kind_of ProjectsDefaultQuery, project.init_default_query |
|
| 1020 |
assert project.init_default_query.new_record? |
|
| 1021 |
end |
|
| 1003 | 1022 |
end |
| test/unit/projects_default_query_test.rb | ||
|---|---|---|
| 1 |
# Redmine - project management software |
|
| 2 |
# Copyright (C) 2006-2016 Jean-Philippe Lang |
|
| 3 |
# |
|
| 4 |
# This program is free software; you can redistribute it and/or |
|
| 5 |
# modify it under the terms of the GNU General Public License |
|
| 6 |
# as published by the Free Software Foundation; either version 2 |
|
| 7 |
# of the License, or (at your option) any later version. |
|
| 8 |
# |
|
| 9 |
# This program is distributed in the hope that it will be useful, |
|
| 10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
| 11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
| 12 |
# GNU General Public License for more details. |
|
| 13 |
# |
|
| 14 |
# You should have received a copy of the GNU General Public License |
|
| 15 |
# along with this program; if not, write to the Free Software |
|
| 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
| 17 | ||
| 18 |
require File.expand_path('../../test_helper', __FILE__)
|
|
| 19 | ||
| 20 |
class ProjectsDefaultQueryTest < ActiveSupport::TestCase |
|
| 21 |
include Redmine::I18n |
|
| 22 | ||
| 23 |
fixtures :projects, :queries |
|
| 24 | ||
| 25 |
def setup |
|
| 26 |
User.current = nil |
|
| 27 |
@project = Project.find(1) |
|
| 28 |
@issue_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => @project) |
|
| 29 |
end |
|
| 30 | ||
| 31 |
def test_initialize_for_should_return_new_record_object |
|
| 32 |
ProjectsDefaultQuery.where(:project_id => @project.id).destroy_all |
|
| 33 |
default_query = ProjectsDefaultQuery.initialize_for(@project.id) |
|
| 34 | ||
| 35 |
assert_equal ProjectsDefaultQuery, default_query.class |
|
| 36 |
assert_equal @project.id, default_query.project_id |
|
| 37 |
assert_equal true, default_query.new_record? |
|
| 38 |
end |
|
| 39 | ||
| 40 |
def test_initialize_for_should_return_presisted_object |
|
| 41 |
ProjectsDefaultQuery.create!(:project_id => @project.id) |
|
| 42 |
default_query = ProjectsDefaultQuery.initialize_for(@project.id) |
|
| 43 | ||
| 44 |
assert_equal ProjectsDefaultQuery, default_query.class |
|
| 45 |
assert_equal @project.id, default_query.project_id |
|
| 46 |
assert_equal true, default_query.persisted? |
|
| 47 |
end |
|
| 48 | ||
| 49 |
def test_validate_query_must_be_selectable |
|
| 50 |
set_language_if_valid 'en' |
|
| 51 |
default_query = ProjectsDefaultQuery.initialize_for(@project.id) |
|
| 52 |
|
|
| 53 |
private_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => @project) |
|
| 54 |
default_query.query_id = private_query.id |
|
| 55 |
assert_not default_query.valid? |
|
| 56 |
assert_includes default_query.errors[:query_id], "is invalid" |
|
| 57 |
|
|
| 58 |
other_project_query = IssueQuery.create!(:name => "test", :user_id => 1, :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => Project.find(2)) |
|
| 59 |
default_query.query_id = other_project_query.id |
|
| 60 |
assert_not default_query.valid? |
|
| 61 |
assert_includes default_query.errors[:query_id], "is invalid" |
|
| 62 |
end |
|
| 63 | ||
| 64 |
def test_query_should_return_issue_query_object_when_associated_query_exist_and_visibility_public |
|
| 65 |
default_query = ProjectsDefaultQuery.create!(:project_id => @project.id, :query_id => @issue_query.id) |
|
| 66 | ||
| 67 |
assert_equal @issue_query, default_query.query |
|
| 68 | ||
| 69 |
@issue_query.update_attribute :project_id, nil |
|
| 70 |
default_query.reload |
|
| 71 | ||
| 72 |
assert_equal @issue_query, default_query.query |
|
| 73 |
end |
|
| 74 | ||
| 75 |
def test_query_should_return_nil_when_associated_query_exist_and_visibility_private |
|
| 76 |
default_query = ProjectsDefaultQuery.create!(:project_id => @project.id, :query_id => @issue_query.id) |
|
| 77 |
|
|
| 78 |
@issue_query.update_attribute :visibility, IssueQuery::VISIBILITY_PRIVATE |
|
| 79 |
default_query.reload |
|
| 80 | ||
| 81 |
assert_nil default_query.query |
|
| 82 |
end |
|
| 83 | ||
| 84 |
def test_query_should_return_nil_when_associated_query_exist_and_difarent_project_query |
|
| 85 |
default_query = ProjectsDefaultQuery.create!(:project_id => @project.id, :query_id => @issue_query.id) |
|
| 86 | ||
| 87 |
@issue_query.update_attribute :project_id, 2 |
|
| 88 |
default_query.reload |
|
| 89 | ||
| 90 |
assert_nil default_query.query |
|
| 91 |
end |
|
| 92 | ||
| 93 |
def test_query_should_return_nil_when_associated_query_does_not_exist |
|
| 94 |
default_query = ProjectsDefaultQuery.create!(:project_id => @project.id, :query_id => @issue_query.id) |
|
| 95 | ||
| 96 |
@issue_query.destroy! |
|
| 97 |
default_query.reload |
|
| 98 | ||
| 99 |
assert_nil default_query.query |
|
| 100 |
end |
|
| 101 |
end |
|
| test/unit/query_test.rb | ||
|---|---|---|
| 999 | 999 |
end |
| 1000 | 1000 |
end |
| 1001 | 1001 | |
| 1002 |
def test_available_query_should_return_true_when_public_query_existed_on_project |
|
| 1003 |
project = Project.find(1) |
|
| 1004 |
IssueQuery.only_public.destroy_all |
|
| 1005 |
public_issue_query_on_project = IssueQuery.create!(:name => "q", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => project) |
|
| 1006 |
public_issue_query_nil_project = IssueQuery.create!(:name => "q", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil) |
|
| 1007 |
assert IssueQuery.available_query?(project.id, public_issue_query_on_project.id) |
|
| 1008 |
assert IssueQuery.available_query?(project.id, public_issue_query_nil_project.id) |
|
| 1009 |
end |
|
| 1010 | ||
| 1011 |
def test_available_query_should_return_false_when_public_query_does_not_existed_on_project |
|
| 1012 |
project = Project.find(1) |
|
| 1013 |
IssueQuery.only_public.destroy_all |
|
| 1014 |
private_issue_query_on_project = IssueQuery.create!(:name => "q", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => project) |
|
| 1015 |
public_issue_query_on_other = IssueQuery.create!(:name => "q", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => Project.find(2)) |
|
| 1016 |
assert_equal false, IssueQuery.available_query?(project.id, private_issue_query_on_project.id) |
|
| 1017 |
assert_equal false, IssueQuery.available_query?(project.id, public_issue_query_on_other.id) |
|
| 1018 |
end |
|
| 1019 | ||
| 1002 | 1020 |
def test_default_columns |
| 1003 | 1021 |
q = IssueQuery.new |
| 1004 | 1022 |
assert q.columns.any? |