@@ -1,5 +1,5 | |||
|
1 |
# |
|
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
|
1 | # Redmine - project management software | |
|
2 | # Copyright (C) 2006-2011 Jean-Philippe Lang | |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
@@ -135,7 +135,6 class Project < ActiveRecord::Base | |||
|
135 | 135 | end |
|
136 | 136 | |
|
137 | 137 | def self.allowed_to_condition(user, permission, options={}) |
|
138 | statements = [] | |
|
139 | 138 | base_statement = "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}" |
|
140 | 139 | if perm = Redmine::AccessControl.permission(permission) |
|
141 | 140 | unless perm.project_module.nil? |
@@ -148,24 +147,31 class Project < ActiveRecord::Base | |||
|
148 | 147 | project_statement << " OR (#{Project.table_name}.lft > #{options[:project].lft} AND #{Project.table_name}.rgt < #{options[:project].rgt})" if options[:with_subprojects] |
|
149 | 148 | base_statement = "(#{project_statement}) AND (#{base_statement})" |
|
150 | 149 | end |
|
150 | ||
|
151 | 151 | if user.admin? |
|
152 | # no restriction | |
|
152 | base_statement | |
|
153 | 153 | else |
|
154 |
statement |
|
|
154 | statement_by_role = {} | |
|
155 | 155 | if user.logged? |
|
156 | 156 | if Role.non_member.allowed_to?(permission) && !options[:member] |
|
157 |
statement |
|
|
157 | statement_by_role[Role.non_member] = "#{Project.table_name}.is_public = #{connection.quoted_true}" | |
|
158 | end | |
|
159 | user.projects_by_role.each do |role, projects| | |
|
160 | if role.allowed_to?(permission) | |
|
161 | statement_by_role[role] = "#{Project.table_name}.id IN (#{projects.collect(&:id).join(',')})" | |
|
162 | end | |
|
158 | 163 | end |
|
159 | allowed_project_ids = user.memberships.select {|m| m.roles.detect {|role| role.allowed_to?(permission)}}.collect {|m| m.project_id} | |
|
160 | statements << "#{Project.table_name}.id IN (#{allowed_project_ids.join(',')})" if allowed_project_ids.any? | |
|
161 | 164 | else |
|
162 | 165 | if Role.anonymous.allowed_to?(permission) && !options[:member] |
|
163 | # anonymous user allowed on public project | |
|
164 | statements << "#{Project.table_name}.is_public = #{connection.quoted_true}" | |
|
166 | statement_by_role[Role.anonymous] = "#{Project.table_name}.is_public = #{connection.quoted_true}" | |
|
165 | 167 | end |
|
166 | 168 | end |
|
169 | if statement_by_role.empty? | |
|
170 | "1=0" | |
|
171 | else | |
|
172 | "((#{base_statement}) AND (#{statement_by_role.values.join(' OR ')}))" | |
|
173 | end | |
|
167 | 174 | end |
|
168 | statements.empty? ? base_statement : "((#{base_statement}) AND (#{statements.join(' OR ')}))" | |
|
169 | 175 | end |
|
170 | 176 | |
|
171 | 177 | # Returns the Systemwide and project specific activities |
@@ -1,5 +1,5 | |||
|
1 | 1 | # Redmine - project management software |
|
2 |
# Copyright (C) 2006-20 |
|
|
2 | # Copyright (C) 2006-2011 Jean-Philippe Lang | |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
@@ -90,6 +90,7 class User < Principal | |||
|
90 | 90 | |
|
91 | 91 | def reload(*args) |
|
92 | 92 | @name = nil |
|
93 | @projects_by_role = nil | |
|
93 | 94 | super |
|
94 | 95 | end |
|
95 | 96 | |
@@ -361,6 +362,23 class User < Principal | |||
|
361 | 362 | !roles_for_project(project).detect {|role| role.member?}.nil? |
|
362 | 363 | end |
|
363 | 364 | |
|
365 | # Returns a hash of user's projects grouped by roles | |
|
366 | def projects_by_role | |
|
367 | return @projects_by_role if @projects_by_role | |
|
368 | ||
|
369 | @projects_by_role = Hash.new {|h,k| h[k]=[]} | |
|
370 | memberships.each do |membership| | |
|
371 | membership.roles.each do |role| | |
|
372 | @projects_by_role[role] << membership.project if membership.project | |
|
373 | end | |
|
374 | end | |
|
375 | @projects_by_role.each do |role, projects| | |
|
376 | projects.uniq! | |
|
377 | end | |
|
378 | ||
|
379 | @projects_by_role | |
|
380 | end | |
|
381 | ||
|
364 | 382 | # Return true if the user is allowed to do the specified action on a specific context |
|
365 | 383 | # Action can be: |
|
366 | 384 | # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') |
@@ -522,6 +522,23 class UserTest < ActiveSupport::TestCase | |||
|
522 | 522 | assert_nil @dlopper.roles_for_project(Project.find(2)).detect {|role| role.member?} |
|
523 | 523 | end |
|
524 | 524 | |
|
525 | def test_projects_by_role_for_user_with_role | |
|
526 | user = User.find(2) | |
|
527 | assert_kind_of Hash, user.projects_by_role | |
|
528 | assert_equal 2, user.projects_by_role.size | |
|
529 | assert_equal [1,5], user.projects_by_role[Role.find(1)].collect(&:id).sort | |
|
530 | assert_equal [2], user.projects_by_role[Role.find(2)].collect(&:id).sort | |
|
531 | end | |
|
532 | ||
|
533 | def test_projects_by_role_for_user_with_no_role | |
|
534 | user = User.generate! | |
|
535 | assert_equal({}, user.projects_by_role) | |
|
536 | end | |
|
537 | ||
|
538 | def test_projects_by_role_for_anonymous | |
|
539 | assert_equal({}, User.anonymous.projects_by_role) | |
|
540 | end | |
|
541 | ||
|
525 | 542 | def test_valid_notification_options |
|
526 | 543 | # without memberships |
|
527 | 544 | assert_equal 5, User.find(7).valid_notification_options.size |
General Comments 0
You need to be logged in to leave comments.
Login now