Feature #7360 » 7360.patch
app/controllers/issues_controller.rb | ||
---|---|---|
44 | 44 | |
45 | 45 |
def index |
46 | 46 |
use_session = !request.format.csv? |
47 |
retrieve_default_query(use_session) |
|
47 | 48 |
retrieve_query(IssueQuery, use_session) |
48 | 49 | |
49 | 50 |
if @query.valid? |
... | ... | |
480 | 481 |
super |
481 | 482 |
end |
482 | 483 | |
484 |
def retrieve_default_query(use_session) |
|
485 |
return if params[:query_id].present? |
|
486 |
return if api_request? |
|
487 |
return if params[:set_filter] && (params.key?(:op) || params.key?(:f)) |
|
488 | ||
489 |
if params[:without_default].present? |
|
490 |
params[:set_filter] = 1 |
|
491 |
return |
|
492 |
end |
|
493 |
if !params[:set_filter] && use_session && session[:issue_query] |
|
494 |
query_id, project_id = session[:issue_query].values_at(:id, :project_id) |
|
495 |
return if IssueQuery.where(id: query_id).exists? && project_id == @project&.id |
|
496 |
end |
|
497 |
if default_query = IssueQuery.default(project: @project) |
|
498 |
params[:query_id] = default_query.id |
|
499 |
end |
|
500 |
end |
|
501 | ||
483 | 502 |
def retrieve_previous_and_next_issue_ids |
484 | 503 |
if params[:prev_issue_id].present? || params[:next_issue_id].present? |
485 | 504 |
@prev_issue_id = params[:prev_issue_id].presence.try(:to_i) |
app/helpers/projects_helper.rb | ||
---|---|---|
114 | 114 |
principals_options_for_select(assignable_users, project.default_assigned_to) |
115 | 115 |
end |
116 | 116 | |
117 |
def project_default_issue_query_options(project) |
|
118 |
public_queries = IssueQuery.only_public |
|
119 |
grouped = { |
|
120 |
l('label_default_queries.for_all_projects') => public_queries.where(project_id: nil).pluck(:name, :id), |
|
121 |
l('label_default_queries.for_current_project') => public_queries.where(project: project).pluck(:name, :id) |
|
122 |
} |
|
123 |
grouped_options_for_select(grouped, project.default_issue_query_id) |
|
124 |
end |
|
125 | ||
117 | 126 |
def format_version_sharing(sharing) |
118 | 127 |
sharing = 'none' unless Version::VERSION_SHARINGS.include?(sharing) |
119 | 128 |
l("label_version_sharing_#{sharing}") |
app/helpers/queries_helper.rb | ||
---|---|---|
395 | 395 |
@query.project = @project |
396 | 396 |
end |
397 | 397 |
@query |
398 |
else |
|
399 |
@query = klass.default project: @project |
|
398 | 400 |
end |
399 | 401 |
end |
400 | 402 | |
... | ... | |
457 | 459 |
queries.collect do |query| |
458 | 460 |
css = +'query' |
459 | 461 |
clear_link = +'' |
462 |
clear_link_param = {:set_filter => 1, :sort => '', :project_id => @project} |
|
463 | ||
464 |
if query == query.class.default(project: @project) |
|
465 |
css << ' default' |
|
466 |
clear_link_param[:without_default] = 1 |
|
467 |
end |
|
468 | ||
460 | 469 |
if query == @query |
461 | 470 |
css << ' selected' |
462 |
clear_link += link_to_clear_query |
|
471 |
clear_link += link_to_clear_query(clear_link_param)
|
|
463 | 472 |
end |
464 | 473 |
content_tag('li', |
465 | 474 |
link_to(query.name, |
... | ... | |
471 | 480 |
) + "\n" |
472 | 481 |
end |
473 | 482 | |
474 |
def link_to_clear_query |
|
483 |
def link_to_clear_query(params = {:set_filter => 1, :sort => '', :project_id => @project})
|
|
475 | 484 |
link_to( |
476 | 485 |
l(:button_clear), |
477 |
{:set_filter => 1, :sort => '', :project_id => @project},
|
|
486 |
params,
|
|
478 | 487 |
:class => 'icon-only icon-clear-query', |
479 | 488 |
:title => l(:button_clear) |
480 | 489 |
) |
app/helpers/settings_helper.rb | ||
---|---|---|
166 | 166 |
options.map {|label, value| [l(label), value.to_s]} |
167 | 167 |
end |
168 | 168 | |
169 |
def default_global_issue_query_options |
|
170 |
[[l(:label_none), '']] + IssueQuery.only_public.where(project_id: nil).pluck(:name, :id) |
|
171 |
end |
|
172 | ||
169 | 173 |
def cross_project_subtasks_options |
170 | 174 |
options = [ |
171 | 175 |
[:label_disabled, ''], |
app/helpers/users_helper.rb | ||
---|---|---|
29 | 29 |
user.valid_notification_options.collect {|o| [l(o.last), o.first]} |
30 | 30 |
end |
31 | 31 | |
32 |
def default_issue_query_options(user) |
|
33 |
global_queries = IssueQuery.for_all_projects |
|
34 |
global_public_queries = global_queries.only_public |
|
35 |
global_user_queries = global_queries.where(user_id: user.id).where.not(id: global_public_queries.pluck(:id)) |
|
36 |
label = user == User.current ? 'label_my_queries' : 'label_default_queries.for_this_user' |
|
37 |
grouped = { |
|
38 |
l('label_default_queries.for_all_users') => global_public_queries.pluck(:name, :id), |
|
39 |
l(".#{label}") => global_user_queries.pluck(:name, :id), |
|
40 |
} |
|
41 |
grouped_options_for_select(grouped, user.pref.default_issue_query) |
|
42 |
end |
|
43 | ||
32 | 44 |
def textarea_font_options |
33 | 45 |
[[l(:label_font_default), '']] + UserPreference::TEXTAREA_FONT_OPTIONS.map {|o| [l("label_font_#{o}"), o]} |
34 | 46 |
end |
app/models/issue_query.rb | ||
---|---|---|
73 | 73 |
QueryColumn.new(:last_notes, :caption => :label_last_notes, :inline => false) |
74 | 74 |
] |
75 | 75 | |
76 |
has_many :projects, foreign_key: 'default_issue_query_id', dependent: :nullify, inverse_of: 'default_issue_query' |
|
77 |
after_update { projects.clear unless visibility == VISIBILITY_PUBLIC } |
|
78 |
scope :only_public, ->{ where(visibility: VISIBILITY_PUBLIC) } |
|
79 |
scope :for_all_projects, ->{ where(project_id: nil) } |
|
80 | ||
81 |
def self.default(project: nil, user: User.current) |
|
82 |
query = nil |
|
83 |
if user&.logged? |
|
84 |
query = find_by_id user.pref.default_issue_query |
|
85 |
end |
|
86 |
query ||= project&.default_issue_query |
|
87 |
query || find_by_id(Setting.default_issue_query) |
|
88 |
end |
|
89 | ||
76 | 90 |
def initialize(attributes=nil, *args) |
77 | 91 |
super attributes |
78 | 92 |
self.filters ||= {'status_id' => {:operator => "o", :values => [""]}} |
app/models/project.rb | ||
---|---|---|
58 | 58 |
:class_name => 'IssueCustomField', |
59 | 59 |
:join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}", |
60 | 60 |
:association_foreign_key => 'custom_field_id' |
61 |
# Default Custom Query |
|
62 |
belongs_to :default_issue_query, :class_name => 'IssueQuery' |
|
61 | 63 | |
62 | 64 |
acts_as_attachable :view_permission => :view_files, |
63 | 65 |
:edit_permission => :manage_files, |
... | ... | |
824 | 826 |
'issue_custom_field_ids', |
825 | 827 |
'parent_id', |
826 | 828 |
'default_version_id', |
829 |
'default_issue_query_id', |
|
827 | 830 |
'default_assigned_to_id') |
828 | 831 | |
829 | 832 |
safe_attributes( |
... | ... | |
1221 | 1224 |
new_query.user_id = query.user_id |
1222 | 1225 |
new_query.role_ids = query.role_ids if query.visibility == ::Query::VISIBILITY_ROLES |
1223 | 1226 |
self.queries << new_query |
1227 |
if query == project.default_issue_query |
|
1228 |
self.default_issue_query = new_query |
|
1229 |
end |
|
1224 | 1230 |
end |
1225 | 1231 |
end |
1226 | 1232 |
app/models/query.rb | ||
---|---|---|
340 | 340 | |
341 | 341 |
scope :sorted, lambda {order(:name, :id)} |
342 | 342 | |
343 |
# to be implemented in subclasses that have a way to determine a default |
|
344 |
# query for the given options |
|
345 |
def self.default(**_) |
|
346 |
nil |
|
347 |
end |
|
348 | ||
343 | 349 |
# Scope of visible queries, can be used from subclasses only. |
344 | 350 |
# Unlike other visible scopes, a class methods is used as it |
345 | 351 |
# let handle inheritance more nicely than scope DSL. |
app/models/user_preference.rb | ||
---|---|---|
37 | 37 |
'textarea_font', |
38 | 38 |
'recently_used_projects', |
39 | 39 |
'history_default_tab', |
40 |
'default_issue_query', |
|
40 | 41 |
'toolbar_language_options') |
41 | 42 | |
42 | 43 |
TEXTAREA_FONT_OPTIONS = ['monospace', 'proportional'] |
... | ... | |
116 | 117 |
self[:toolbar_language_options] = languages.join(',') |
117 | 118 |
end |
118 | 119 | |
120 |
def default_issue_query; self[:default_issue_query] end |
|
121 |
def default_issue_query=(value); self[:default_issue_query]=value; end |
|
122 | ||
119 | 123 |
# Returns the names of groups that are displayed on user's page |
120 | 124 |
# Example: |
121 | 125 |
# preferences.my_page_groups |
app/views/projects/settings/_issues.html.erb | ||
---|---|---|
41 | 41 |
<% if @project.safe_attribute?('default_assigned_to_id') %> |
42 | 42 |
<p><%= f.select :default_assigned_to_id, project_default_assigned_to_options(@project), include_blank: l(:label_none) %></p> |
43 | 43 |
<% end %> |
44 | ||
45 |
<% if @project.safe_attribute?('default_issue_query_id') %> |
|
46 |
<p><%= f.select :default_issue_query_id, project_default_issue_query_options(@project), include_blank: l(:label_none) %><em class="info"><%=l 'text_allowed_queries_to_select' %></em></p> |
|
47 |
<% end %> |
|
44 | 48 |
</div> |
45 | 49 | |
46 | 50 |
<p><%= submit_tag l(:button_save) %></p> |
app/views/settings/_issues.html.erb | ||
---|---|---|
47 | 47 |
IssueQuery.new(:totalable_names => Setting.issue_list_default_totals).available_totalable_columns.map {|c| [c.caption, c.name.to_s]}, |
48 | 48 |
:inline => true, |
49 | 49 |
:label => :label_total_plural %></p> |
50 | ||
51 |
<p><%= setting_select :default_issue_query, default_global_issue_query_options %></p> |
|
50 | 52 |
</fieldset> |
51 | 53 | |
52 | 54 |
<%= submit_tag l(:button_save) %> |
app/views/users/_preferences.html.erb | ||
---|---|---|
7 | 7 |
<p><%= pref_fields.text_field :recently_used_projects, :size => 2 %></p> |
8 | 8 |
<p><%= pref_fields.select :history_default_tab, history_default_tab_options %></p> |
9 | 9 |
<p><%= pref_fields.text_area :toolbar_language_options, :rows => 4 %></p> |
10 |
<p><%= pref_fields.select :default_issue_query, default_issue_query_options(@user), include_blank: l(:label_none) %></p> |
|
10 | 11 |
<% end %> |
config/locales/de.yml | ||
---|---|---|
514 | 514 |
label_day_plural: Tage |
515 | 515 |
label_default: Standard |
516 | 516 |
label_default_columns: Standard-Spalten |
517 |
label_default_queries: |
|
518 |
for_all_projects: Für alle Projekte |
|
519 |
for_current_project: Für das aktuelle Projekt |
|
520 |
for_all_users: Für alle Benutzer |
|
517 | 521 |
label_deleted: gelöscht |
518 | 522 |
label_descending: Absteigend |
519 | 523 |
label_details: Details |
... | ... | |
997 | 1001 |
setting_cross_project_subtasks: Projektübergreifende untergeordnete Tickets erlauben |
998 | 1002 |
setting_date_format: Datumsformat |
999 | 1003 |
setting_default_issue_start_date_to_creation_date: Aktuelles Datum als Beginn für neue Tickets verwenden |
1004 |
setting_default_issue_query: Standardabfrage |
|
1000 | 1005 |
setting_default_language: Standardsprache |
1001 | 1006 |
setting_default_notification_option: Standard Benachrichtigungsoptionen |
1002 | 1007 |
setting_default_projects_modules: Standardmäßig aktivierte Module für neue Projekte |
... | ... | |
1064 | 1069 |
status_registered: nicht aktivierte |
1065 | 1070 | |
1066 | 1071 |
text_account_destroy_confirmation: "Möchten Sie wirklich fortfahren?\nIhr Benutzerkonto wird für immer gelöscht und kann nicht wiederhergestellt werden." |
1072 |
text_allowed_queries_to_select: Nur für alle sichtbare Abfragen können ausgewählt werden |
|
1067 | 1073 |
text_are_you_sure: Sind Sie sicher? |
1068 | 1074 |
text_assign_time_entries_to_project: Gebuchte Aufwände dem Projekt zuweisen |
1069 | 1075 |
text_caracters_maximum: "Max. %{count} Zeichen." |
config/locales/en.yml | ||
---|---|---|
409 | 409 |
field_unique_id: Unique ID |
410 | 410 |
field_toolbar_language_options: Code highlighting toolbar languages |
411 | 411 |
field_twofa_required: Require two factor authentication |
412 |
field_default_issue_query: Default issue query |
|
412 | 413 | |
413 | 414 |
setting_app_title: Application title |
414 | 415 |
setting_welcome_text: Welcome text |
... | ... | |
509 | 510 |
setting_show_status_changes_in_mail_subject: Show status changes in issue mail notifications subject |
510 | 511 |
setting_project_list_defaults: Projects list defaults |
511 | 512 |
setting_twofa: Two-factor authentication |
513 |
setting_default_issue_query: Default Query |
|
512 | 514 | |
513 | 515 |
permission_add_project: Create project |
514 | 516 |
permission_add_subprojects: Create subprojects |
... | ... | |
1097 | 1099 |
label_optgroup_others: Other projects |
1098 | 1100 |
label_optgroup_recents: Recently used |
1099 | 1101 |
label_last_notes: Last notes |
1102 |
label_default_queries: |
|
1103 |
for_all_projects: For all projects |
|
1104 |
for_current_project: For current project |
|
1105 |
for_all_users: For all users |
|
1100 | 1106 |
label_nothing_to_preview: Nothing to preview |
1101 | 1107 |
label_inherited_from_parent_project: "Inherited from parent project" |
1102 | 1108 |
label_inherited_from_group: "Inherited from group %{name}" |
... | ... | |
1277 | 1283 |
text_select_apply_tracker: "Select tracker" |
1278 | 1284 |
text_avatar_server_config_html: The current avatar server is <a href="%{url}">%{url}</a>. You can configure it in config/configuration.yml. |
1279 | 1285 |
text_no_subject: no subject |
1286 |
text_allowed_queries_to_select: Public (to any users) queries only selectable |
|
1280 | 1287 | |
1281 | 1288 | |
1282 | 1289 |
default_role_manager: Manager |
config/locales/fr.yml | ||
---|---|---|
391 | 391 |
field_full_width_layout: Afficher sur toute la largeur |
392 | 392 |
field_digest: Checksum |
393 | 393 |
field_default_assigned_to: Assigné par défaut |
394 |
field_default_issue_query: Rapport par défaut |
|
394 | 395 | |
395 | 396 |
setting_app_title: Titre de l'application |
396 | 397 |
setting_welcome_text: Texte d'accueil |
... | ... | |
481 | 482 |
setting_time_entry_list_defaults: Affichage par défaut de la liste des temps passés |
482 | 483 |
setting_timelog_accept_0_hours: Autoriser la saisie de temps avec 0 heure |
483 | 484 |
setting_timelog_max_hours_per_day: Maximum d'heures pouvant être saisies par un utilisateur sur un jour |
485 |
setting_default_issue_query: Rapport par défaut |
|
484 | 486 | |
485 | 487 |
permission_add_project: Créer un projet |
486 | 488 |
permission_add_subprojects: Créer des sous-projets |
... | ... | |
1026 | 1028 |
label_font_monospace: Police non proportionnelle |
1027 | 1029 |
label_font_proportional: Police proportionnelle |
1028 | 1030 |
label_last_notes: Dernières notes |
1031 |
label_default_queries: |
|
1032 |
for_all_projects: Pour tous les projets |
|
1033 |
for_current_project: Pour le projet en cours |
|
1034 |
for_all_users: Pour tous les utilisateurs |
|
1029 | 1035 |
label_trackers_description: Description des trackers |
1030 | 1036 |
label_open_trackers_description: Afficher la description des trackers |
1031 | 1037 | |
... | ... | |
1217 | 1223 |
description_issue_category_reassign: Choisir une catégorie |
1218 | 1224 |
description_wiki_subpages_reassign: Choisir une nouvelle page parent |
1219 | 1225 |
text_repository_identifier_info: 'Seuls les lettres minuscules (a-z), chiffres, tirets et tirets bas sont autorisés.<br />Un fois sauvegardé, l''identifiant ne pourra plus être modifié.' |
1226 |
text_allowed_queries_to_select: Seuls les rapports publics (pour tous les utilisateurs) sont sélectionnables |
|
1220 | 1227 |
label_parent_task_attributes_derived: Calculé à partir des sous-tâches |
1221 | 1228 |
label_parent_task_attributes_independent: Indépendent des sous-tâches |
1222 | 1229 |
mail_subject_security_notification: Notification de sécurité |
config/settings.yml | ||
---|---|---|
122 | 122 |
gantt_months_limit: |
123 | 123 |
format: int |
124 | 124 |
default: 24 |
125 |
default_issue_query: |
|
126 |
default: '' |
|
125 | 127 |
# Maximum size of files that can be displayed |
126 | 128 |
# inline through the file viewer (in KB) |
127 | 129 |
file_max_size_displayed: |
db/migrate/20210705111300_add_projects_default_issue_query_id.rb | ||
---|---|---|
1 |
class AddProjectsDefaultIssueQueryId < ActiveRecord::Migration[4.2] |
|
2 |
def self.up |
|
3 |
add_column :projects, :default_issue_query_id, :integer, :default => nil |
|
4 |
end |
|
5 | ||
6 |
def self.down |
|
7 |
remove_column :projects, :default_issue_query_id |
|
8 |
end |
|
9 |
end |
public/stylesheets/application.css | ||
---|---|---|
152 | 152 | |
153 | 153 |
#sidebar a.selected {line-height:1.7em; padding:1px 3px 2px 2px; margin-left:-2px; background-color:#9DB9D5; color:#fff; border-radius:2px;} |
154 | 154 |
#sidebar a.selected:hover {text-decoration:none;} |
155 |
#sidebar .query.default {font-weight: bold;} |
|
155 | 156 |
#admin-menu a {line-height:1.7em;} |
156 | 157 |
#admin-menu a.selected {padding-left: 20px !important; background-position: 2px 40%;} |
157 | 158 |
test/functional/issues_controller_test.rb | ||
---|---|---|
8225 | 8225 |
end |
8226 | 8226 |
end |
8227 | 8227 |
end |
8228 | ||
8229 |
def test_index_should_retrieve_default_query |
|
8230 |
query = IssueQuery.find(4) |
|
8231 |
IssueQuery.stubs(:default).returns query |
|
8232 | ||
8233 |
[nil, 1].each do |user_id| |
|
8234 |
@request.session[:user_id] = user_id |
|
8235 |
get :index |
|
8236 |
assert_select 'h2', text: query.name |
|
8237 | ||
8238 |
get :index, params: { project_id: 1 } |
|
8239 |
assert_select 'h2', text: query.name |
|
8240 |
end |
|
8241 |
end |
|
8242 | ||
8243 |
def test_index_should_ignore_default_query_with_without_default |
|
8244 |
query = IssueQuery.find(4) |
|
8245 |
IssueQuery.stubs(:default).returns query |
|
8246 | ||
8247 |
[nil, 1].each do |user_id| |
|
8248 |
@request.session[:user_id] = user_id |
|
8249 |
get :index, params: { set_filter: '1', without_default: '1' } |
|
8250 |
assert_select 'h2', text: I18n.t(:label_issue_plural) |
|
8251 | ||
8252 |
get :index, params: { project_id: 1, set_filter: '1', without_default: '1' } |
|
8253 |
assert_select 'h2', text: I18n.t(:label_issue_plural) |
|
8254 |
end |
|
8255 |
end |
|
8256 | ||
8257 |
def test_index_should_ignore_default_query_with_session_query |
|
8258 |
query = IssueQuery.find 4 |
|
8259 |
IssueQuery.stubs(:default).returns query |
|
8260 |
session_query = IssueQuery.find 1 |
|
8261 | ||
8262 |
@request.session[:issue_query] = { id: 1, project_id: 1} |
|
8263 |
@request.session[:user_id] = 1 |
|
8264 |
get :index, params: { project_id: '1' } |
|
8265 |
assert_select 'h2', text: session_query.name |
|
8266 |
end |
|
8267 | ||
8268 |
def test_index_global_should_ignore_default_query_with_session_query |
|
8269 |
query = IssueQuery.find 4 |
|
8270 |
IssueQuery.stubs(:default).returns query |
|
8271 |
session_query = IssueQuery.find 5 |
|
8272 | ||
8273 |
@request.session[:issue_query] = { id: 5, project_id: nil} |
|
8274 |
@request.session[:user_id] = 1 |
|
8275 |
get :index |
|
8276 |
assert_select 'h2', text: session_query.name |
|
8277 |
end |
|
8278 | ||
8279 |
def test_index_should_use_default_query_with_invalid_session_query |
|
8280 |
query = IssueQuery.find 4 |
|
8281 |
IssueQuery.stubs(:default).returns query |
|
8282 | ||
8283 |
@request.session[:issue_query] = { id: 1, project_id: 1} |
|
8284 |
@request.session[:user_id] = 1 |
|
8285 |
get :index |
|
8286 |
assert_select 'h2', text: query.name |
|
8287 |
end |
|
8288 | ||
8289 |
def test_index_should_not_load_default_query_for_api_request |
|
8290 |
query = IssueQuery.find 4 |
|
8291 |
IssueQuery.stubs(:default).returns query |
|
8292 | ||
8293 |
@request.session[:user_id] = 1 |
|
8294 |
get :index, params: { format: 'json' } |
|
8295 | ||
8296 |
assert results = JSON.parse(@response.body)['issues'] |
|
8297 |
# query filters for tracker_id == 3 |
|
8298 |
assert results.detect{ |i| i['tracker_id'] != 3 } |
|
8299 |
end |
|
8228 | 8300 |
end |
test/unit/project_copy_test.rb | ||
---|---|---|
283 | 283 |
assert_equal [1, 3], query.role_ids.sort |
284 | 284 |
end |
285 | 285 | |
286 |
test "#copy should copy default issue query assignment" do |
|
287 |
source = Project.generate! |
|
288 |
query = IssueQuery.generate!(:project => source, :user => User.find(2)) |
|
289 |
source.update_column :default_issue_query_id, query.id |
|
290 | ||
291 |
target = Project.new(:name => 'Copy Test', :identifier => 'copy-test') |
|
292 |
assert target.copy(source) |
|
293 | ||
294 |
assert target.default_issue_query.present? |
|
295 |
assert_equal 1, target.queries.size |
|
296 |
assert_equal query.name, target.default_issue_query.name |
|
297 |
end |
|
298 | ||
286 | 299 |
test "#copy should copy versions" do |
287 | 300 |
@source_project.versions << Version.generate! |
288 | 301 |
@source_project.versions << Version.generate! |
test/unit/query_test.rb | ||
---|---|---|
2750 | 2750 |
# Non-paginated issue ids and paginated issue ids should be in the same order. |
2751 | 2751 |
assert_equal issue_ids, paginated_issue_ids |
2752 | 2752 |
end |
2753 | ||
2754 |
def test_destruction_of_default_query_should_remove_reference_from_project |
|
2755 |
project = Project.find('ecookbook') |
|
2756 |
project_query = IssueQuery.find(1) |
|
2757 |
project.update_column :default_issue_query_id, project_query.id |
|
2758 | ||
2759 |
project_query.destroy |
|
2760 |
project.reload |
|
2761 |
assert_nil project.default_issue_query_id |
|
2762 |
end |
|
2763 | ||
2764 |
def test_should_determine_default_issue_query |
|
2765 |
project = Project.find('ecookbook') |
|
2766 |
user = project.users.first |
|
2767 | ||
2768 |
project_query = IssueQuery.find(1) |
|
2769 |
query = IssueQuery.find(4) |
|
2770 |
user_query = IssueQuery.find(3) |
|
2771 |
user_query.update_column :user_id, user.id |
|
2772 | ||
2773 |
[nil, user, User.anonymous].each do |u| |
|
2774 |
[nil, project].each do |p| |
|
2775 |
assert_nil IssueQuery.default(project: p, user: u) |
|
2776 |
end |
|
2777 |
end |
|
2778 | ||
2779 |
# only global default is set |
|
2780 |
with_settings :default_issue_query => query.id do |
|
2781 |
[nil, user, User.anonymous].each do |u| |
|
2782 |
[nil, project].each do |p| |
|
2783 |
assert_equal query, IssueQuery.default(project: p, user: u) |
|
2784 |
end |
|
2785 |
end |
|
2786 |
end |
|
2787 | ||
2788 |
# with project default |
|
2789 |
assert_equal project.id, project_query.project_id |
|
2790 |
project.update_column :default_issue_query_id, project_query.id |
|
2791 |
[nil, user, User.anonymous].each do |u| |
|
2792 |
assert_nil IssueQuery.default(project: nil, user: u) |
|
2793 |
assert_equal project_query, IssueQuery.default(project: project, user: u) |
|
2794 |
end |
|
2795 | ||
2796 |
# project default should override global default |
|
2797 |
with_settings :default_issue_query => query.id do |
|
2798 |
[nil, user, User.anonymous].each do |u| |
|
2799 |
assert_equal query, IssueQuery.default(project: nil, user: u) |
|
2800 |
assert_equal project_query, IssueQuery.default(project: project, user: u) |
|
2801 |
end |
|
2802 |
end |
|
2803 | ||
2804 |
# user default, overrides project and global default |
|
2805 |
user.pref.default_issue_query = user_query.id |
|
2806 |
user.pref.save |
|
2807 |
with_settings :default_issue_query => query.id do |
|
2808 |
[nil, project].each do |p| |
|
2809 |
assert_equal user_query, IssueQuery.default(project: p, user: user) |
|
2810 |
assert_equal user_query, IssueQuery.default(project: p, user: user) |
|
2811 |
end |
|
2812 |
end |
|
2813 |
end |
|
2753 | 2814 |
end |