Feature #2055 ยป 2055_git.diff
| app/models/query.rb | ||
|---|---|---|
| 185 | 185 |
user_values = [] |
| 186 | 186 |
user_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged?
|
| 187 | 187 |
if project |
| 188 |
user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] }
|
|
| 188 |
user_values += User.in_project_hierarchy_of(project).sort.collect{|s| [s.name, s.id.to_s] }
|
|
| 189 | 189 |
else |
| 190 |
project_ids = User.current.projects.collect(&:id)
|
|
| 191 |
if project_ids.any?
|
|
| 192 |
# members of the user's projects |
|
| 193 |
user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", project_ids]).sort.collect{|s| [s.name, s.id.to_s] }
|
|
| 190 |
projects = User.current.projects
|
|
| 191 |
if projects.any? |
|
| 192 |
# members of the user's projects and subprojects
|
|
| 193 |
user_values += User.in_project_hierarchy_of(projects).sort.collect{|s| [s.name, s.id.to_s] }
|
|
| 194 | 194 |
end |
| 195 | 195 |
end |
| 196 | 196 |
@available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty?
|
| app/models/user.rb | ||
|---|---|---|
| 237 | 237 |
find(:first, :conditions => ["LOWER(mail) = ?", mail.to_s.downcase]) |
| 238 | 238 |
end |
| 239 | 239 |
|
| 240 |
# Active members of project or subprojects |
|
| 241 |
def self.in_project_hierarchy_of(projects) |
|
| 242 |
projects = [projects] unless projects.is_a?(Array) |
|
| 243 |
#add the (visible) subprojects |
|
| 244 |
projects = projects.map do |project| |
|
| 245 |
project.self_and_descendants.all(:conditions => Project.visible_by(User.current)) |
|
| 246 |
end.flatten |
|
| 247 |
#search active users in all these projects |
|
| 248 |
active.all( |
|
| 249 |
:conditions => [ "#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))",
|
|
| 250 |
projects.map(&:id) ] |
|
| 251 |
) |
|
| 252 |
end |
|
| 253 |
|
|
| 240 | 254 |
def to_s |
| 241 | 255 |
name |
| 242 | 256 |
end |
| test/fixtures/members.yml | ||
|---|---|---|
| 60 | 60 |
project_id: 2 |
| 61 | 61 |
user_id: 8 |
| 62 | 62 |
mail_notification: false |
| 63 |
members_011: |
|
| 64 |
id: 11 |
|
| 65 |
created_on: 2006-07-19 19:35:33 +02:00 |
|
| 66 |
project_id: 3 |
|
| 67 |
user_id: 8 |
|
| 68 |
mail_notification: false |
|
| test/unit/query_test.rb | ||
|---|---|---|
| 351 | 351 |
assert !q.editable_by?(manager) |
| 352 | 352 |
assert !q.editable_by?(developer) |
| 353 | 353 |
end |
| 354 | ||
| 355 |
context "#available_filters" do |
|
| 356 |
should "include users of subprojects" do |
|
| 357 |
query = Query.new(:project => Project.find(1), :name => '_') |
|
| 358 |
users = query.available_filters["assigned_to_id"][:values] |
|
| 359 |
assert users.map{|u|u[1]}.include?("8")
|
|
| 360 |
end |
|
| 361 |
end |
|
| 354 | 362 |
end |
| test/unit/user_test.rb | ||
|---|---|---|
| 219 | 219 |
end |
| 220 | 220 |
end |
| 221 | 221 | |
| 222 |
context "User#in_project_hierarchy_of" do |
|
| 223 |
should "return users of projets AND subprojects" do |
|
| 224 |
#Project(3) is child of Project(1) |
|
| 225 |
#User(8) is only member of Project(3) |
|
| 226 |
users = User.in_project_hierarchy_of(Project.find(1)) |
|
| 227 |
assert users.map(&:id).include?(8) |
|
| 228 |
end |
|
| 229 |
|
|
| 230 |
should "not return users of subprojects not visible by current user" do |
|
| 231 |
#Project(5) is private child of Project(1) |
|
| 232 |
#User(1) is in Project(5), but not current user (Anonymous) |
|
| 233 |
users = User.in_project_hierarchy_of(Project.find(1)) |
|
| 234 |
assert !users.map(&:id).include?(1) |
|
| 235 |
end |
|
| 236 |
end |
|
| 237 | ||
| 222 | 238 |
def test_roles_for_project |
| 223 | 239 |
# user with a role |
| 224 | 240 |
roles = @jsmith.roles_for_project(Project.find(1)) |