@@ -38,7 +38,7 class VersionsController < ApplicationController | |||||
38 |
|
38 | |||
39 | @versions = @project.shared_versions.preload(:custom_values) |
|
39 | @versions = @project.shared_versions.preload(:custom_values) | |
40 | @versions += @project.rolled_up_versions.visible.preload(:custom_values) if @with_subprojects |
|
40 | @versions += @project.rolled_up_versions.visible.preload(:custom_values) if @with_subprojects | |
41 | @versions = @versions.uniq.sort |
|
41 | @versions = @versions.to_a.uniq.sort | |
42 | unless params[:completed] |
|
42 | unless params[:completed] | |
43 | @completed_versions = @versions.select(&:completed?) |
|
43 | @completed_versions = @versions.select(&:completed?) | |
44 | @versions -= @completed_versions |
|
44 | @versions -= @completed_versions |
@@ -66,7 +66,7 class IssueStatus < ActiveRecord::Base | |||||
66 | end |
|
66 | end | |
67 | end |
|
67 | end | |
68 |
|
68 | |||
69 |
scope. |
|
69 | scope.distinct.to_a.sort | |
70 | else |
|
70 | else | |
71 | [] |
|
71 | [] | |
72 | end |
|
72 | end |
@@ -40,7 +40,7 class Journal < ActiveRecord::Base | |||||
40 | :scope => preload({:issue => :project}, :user). |
|
40 | :scope => preload({:issue => :project}, :user). | |
41 | joins("LEFT OUTER JOIN #{JournalDetail.table_name} ON #{JournalDetail.table_name}.journal_id = #{Journal.table_name}.id"). |
|
41 | joins("LEFT OUTER JOIN #{JournalDetail.table_name} ON #{JournalDetail.table_name}.journal_id = #{Journal.table_name}.id"). | |
42 | where("#{Journal.table_name}.journalized_type = 'Issue' AND" + |
|
42 | where("#{Journal.table_name}.journalized_type = 'Issue' AND" + | |
43 |
" (#{JournalDetail.table_name}.prop_key = 'status_id' OR #{Journal.table_name}.notes <> '')"). |
|
43 | " (#{JournalDetail.table_name}.prop_key = 'status_id' OR #{Journal.table_name}.notes <> '')").distinct | |
44 |
|
44 | |||
45 | before_create :split_private_notes |
|
45 | before_create :split_private_notes | |
46 | after_create :send_notification |
|
46 | after_create :send_notification |
@@ -19,7 +19,7 class Member < ActiveRecord::Base | |||||
19 | belongs_to :user |
|
19 | belongs_to :user | |
20 | belongs_to :principal, :foreign_key => 'user_id' |
|
20 | belongs_to :principal, :foreign_key => 'user_id' | |
21 | has_many :member_roles, :dependent => :destroy |
|
21 | has_many :member_roles, :dependent => :destroy | |
22 |
has_many :roles, lambda { |
|
22 | has_many :roles, lambda { distinct }, :through => :member_roles | |
23 | belongs_to :project |
|
23 | belongs_to :project | |
24 |
|
24 | |||
25 | validates_presence_of :principal, :project |
|
25 | validates_presence_of :principal, :project |
@@ -233,11 +233,11 class Project < ActiveRecord::Base | |||||
233 | end |
|
233 | end | |
234 |
|
234 | |||
235 | def principals |
|
235 | def principals | |
236 |
@principals ||= Principal.active.joins(:members).where("#{Member.table_name}.project_id = ?", id). |
|
236 | @principals ||= Principal.active.joins(:members).where("#{Member.table_name}.project_id = ?", id).distinct | |
237 | end |
|
237 | end | |
238 |
|
238 | |||
239 | def users |
|
239 | def users | |
240 |
@users ||= User.active.joins(:members).where("#{Member.table_name}.project_id = ?", id). |
|
240 | @users ||= User.active.joins(:members).where("#{Member.table_name}.project_id = ?", id).distinct | |
241 | end |
|
241 | end | |
242 |
|
242 | |||
243 | # Returns the Systemwide and project specific activities |
|
243 | # Returns the Systemwide and project specific activities | |
@@ -437,7 +437,7 class Project < ActiveRecord::Base | |||||
437 | joins(projects: :enabled_modules). |
|
437 | joins(projects: :enabled_modules). | |
438 | where("#{Project.table_name}.status <> ?", STATUS_ARCHIVED). |
|
438 | where("#{Project.table_name}.status <> ?", STATUS_ARCHIVED). | |
439 | where(:enabled_modules => {:name => 'issue_tracking'}). |
|
439 | where(:enabled_modules => {:name => 'issue_tracking'}). | |
440 |
|
|
440 | distinct. | |
441 | sorted |
|
441 | sorted | |
442 | end |
|
442 | end | |
443 |
|
443 | |||
@@ -522,7 +522,7 class Project < ActiveRecord::Base | |||||
522 | active. |
|
522 | active. | |
523 | joins(:members => :roles). |
|
523 | joins(:members => :roles). | |
524 | where(:type => types, :members => {:project_id => id}, :roles => {:assignable => true}). |
|
524 | where(:type => types, :members => {:project_id => id}, :roles => {:assignable => true}). | |
525 |
|
|
525 | distinct. | |
526 | sorted |
|
526 | sorted | |
527 |
|
527 | |||
528 | if tracker |
|
528 | if tracker |
@@ -283,7 +283,7 class Repository < ActiveRecord::Base | |||||
283 |
|
283 | |||
284 | # Returns an array of committers usernames and associated user_id |
|
284 | # Returns an array of committers usernames and associated user_id | |
285 | def committers |
|
285 | def committers | |
286 |
@committers ||= Changeset.where(:repository_id => id). |
|
286 | @committers ||= Changeset.where(:repository_id => id).distinct.pluck(:committer, :user_id) | |
287 | end |
|
287 | end | |
288 |
|
288 | |||
289 | # Maps committers username to a user ids |
|
289 | # Maps committers username to a user ids |
@@ -66,7 +66,7 class Tracker < ActiveRecord::Base | |||||
66 | end |
|
66 | end | |
67 | end |
|
67 | end | |
68 | end |
|
68 | end | |
69 |
joins(:projects).where(condition). |
|
69 | joins(:projects).where(condition).distinct | |
70 | } |
|
70 | } | |
71 |
|
71 | |||
72 | def to_s; name end |
|
72 | def to_s; name end | |
@@ -85,7 +85,7 class Tracker < ActiveRecord::Base | |||||
85 | if new_record? |
|
85 | if new_record? | |
86 | [] |
|
86 | [] | |
87 | else |
|
87 | else | |
88 |
@issue_status_ids ||= WorkflowTransition.where(:tracker_id => id). |
|
88 | @issue_status_ids ||= WorkflowTransition.where(:tracker_id => id).distinct.pluck(:old_status_id, :new_status_id).flatten.uniq | |
89 | end |
|
89 | end | |
90 | end |
|
90 | end | |
91 |
|
91 |
@@ -140,7 +140,7 class User < Principal | |||||
140 | scope :having_mail, lambda {|arg| |
|
140 | scope :having_mail, lambda {|arg| | |
141 | addresses = Array.wrap(arg).map {|a| a.to_s.downcase} |
|
141 | addresses = Array.wrap(arg).map {|a| a.to_s.downcase} | |
142 | if addresses.any? |
|
142 | if addresses.any? | |
143 |
joins(:email_addresses).where("LOWER(#{EmailAddress.table_name}.address) IN (?)", addresses). |
|
143 | joins(:email_addresses).where("LOWER(#{EmailAddress.table_name}.address) IN (?)", addresses).distinct | |
144 | else |
|
144 | else | |
145 | none |
|
145 | none | |
146 | end |
|
146 | end |
@@ -167,7 +167,7 module Redmine | |||||
167 | scope. |
|
167 | scope. | |
168 | reorder(searchable_options[:date_column] => :desc, :id => :desc). |
|
168 | reorder(searchable_options[:date_column] => :desc, :id => :desc). | |
169 | limit(limit). |
|
169 | limit(limit). | |
170 |
|
|
170 | distinct. | |
171 | pluck(searchable_options[:date_column], :id). |
|
171 | pluck(searchable_options[:date_column], :id). | |
172 | # converts timestamps to integers for faster sort |
|
172 | # converts timestamps to integers for faster sort | |
173 | map {|timestamp, id| [timestamp.to_i, id]} |
|
173 | map {|timestamp, id| [timestamp.to_i, id]} |
@@ -168,7 +168,7 module Redmine | |||||
168 | joins("LEFT JOIN #{Project.table_name} child ON #{Project.table_name}.lft <= child.lft AND #{Project.table_name}.rgt >= child.rgt"). |
|
168 | joins("LEFT JOIN #{Project.table_name} child ON #{Project.table_name}.lft <= child.lft AND #{Project.table_name}.rgt >= child.rgt"). | |
169 | where("child.id IN (?)", ids). |
|
169 | where("child.id IN (?)", ids). | |
170 | order("#{Project.table_name}.lft ASC"). |
|
170 | order("#{Project.table_name}.lft ASC"). | |
171 |
|
|
171 | distinct. | |
172 | to_a |
|
172 | to_a | |
173 | else |
|
173 | else | |
174 | @projects = [] |
|
174 | @projects = [] |
@@ -176,7 +176,7 module Redmine | |||||
176 | reorder(:id).lock.ids |
|
176 | reorder(:id).lock.ids | |
177 | update_all(:root_id => nil, :lft => nil, :rgt => nil) |
|
177 | update_all(:root_id => nil, :lft => nil, :rgt => nil) | |
178 | where(:parent_id => nil).update_all(["root_id = id, lft = ?, rgt = ?", 1, 2]) |
|
178 | where(:parent_id => nil).update_all(["root_id = id, lft = ?, rgt = ?", 1, 2]) | |
179 |
roots_with_children = joins("JOIN #{table_name} parent ON parent.id = #{table_name}.parent_id AND parent.id = parent.root_id"). |
|
179 | roots_with_children = joins("JOIN #{table_name} parent ON parent.id = #{table_name}.parent_id AND parent.id = parent.root_id").distinct.pluck("parent.id") | |
180 | roots_with_children.each do |root_id| |
|
180 | roots_with_children.each do |root_id| | |
181 | rebuild_nodes(root_id) |
|
181 | rebuild_nodes(root_id) | |
182 | end |
|
182 | end |
@@ -172,7 +172,7 class IssuesTest < Redmine::IntegrationTest | |||||
172 | def test_issue_with_user_custom_field |
|
172 | def test_issue_with_user_custom_field | |
173 | @field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true, :trackers => Tracker.all) |
|
173 | @field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true, :trackers => Tracker.all) | |
174 | Role.anonymous.add_permission! :add_issues, :edit_issues |
|
174 | Role.anonymous.add_permission! :add_issues, :edit_issues | |
175 |
users = Project.find(1).users. |
|
175 | users = Project.find(1).users.sort | |
176 | tester = users.first |
|
176 | tester = users.first | |
177 |
|
177 | |||
178 | # Issue form |
|
178 | # Issue form |
@@ -242,7 +242,7 class ProjectMembersInheritanceTest < ActiveSupport::TestCase | |||||
242 |
|
242 | |||
243 | member = project.reload.memberships.detect {|m| m.principal == user} |
|
243 | member = project.reload.memberships.detect {|m| m.principal == user} | |
244 | assert_not_nil member |
|
244 | assert_not_nil member | |
245 |
assert_equal [1, 2, 3], member.roles. |
|
245 | assert_equal [1, 2, 3], member.roles.map(&:id).uniq.sort | |
246 | end |
|
246 | end | |
247 | end |
|
247 | end | |
248 |
|
248 | |||
@@ -258,7 +258,7 class ProjectMembersInheritanceTest < ActiveSupport::TestCase | |||||
258 |
|
258 | |||
259 | member = project.reload.memberships.detect {|m| m.principal == user} |
|
259 | member = project.reload.memberships.detect {|m| m.principal == user} | |
260 | assert_not_nil member |
|
260 | assert_not_nil member | |
261 |
assert_equal [1, 2, 3], member.roles. |
|
261 | assert_equal [1, 2, 3], member.roles.map(&:id).uniq.sort | |
262 | end |
|
262 | end | |
263 | end |
|
263 | end | |
264 | end |
|
264 | end |
@@ -992,12 +992,12 class ProjectTest < ActiveSupport::TestCase | |||||
992 | assert_include 'closed', p.css_classes.split |
|
992 | assert_include 'closed', p.css_classes.split | |
993 | end |
|
993 | end | |
994 |
|
994 | |||
995 |
def test_combination_of_visible_and_ |
|
995 | def test_combination_of_visible_and_distinct_scopes_in_case_anonymous_group_has_memberships_should_not_error | |
996 | project = Project.find(1) |
|
996 | project = Project.find(1) | |
997 | member = Member.create!(:project => project, :principal => Group.anonymous, :roles => [Role.generate!]) |
|
997 | member = Member.create!(:project => project, :principal => Group.anonymous, :roles => [Role.generate!]) | |
998 | project.members << member |
|
998 | project.members << member | |
999 | assert_nothing_raised do |
|
999 | assert_nothing_raised do | |
1000 |
Project. |
|
1000 | Project.distinct.visible.to_a | |
1001 | end |
|
1001 | end | |
1002 | end |
|
1002 | end | |
1003 | end |
|
1003 | end |
General Comments 0
You need to be logged in to leave comments.
Login now