@@ -204,9 +204,9 class Project < ActiveRecord::Base | |||
|
204 | 204 | statement_by_role[role] = s |
|
205 | 205 | end |
|
206 | 206 | end |
|
207 | user.projects_by_role.each do |role, projects| | |
|
208 | if role.allowed_to?(permission) && projects.any? | |
|
209 |
statement_by_role[role] = "#{Project.table_name}.id IN (#{project |
|
|
207 | user.project_ids_by_role.each do |role, project_ids| | |
|
208 | if role.allowed_to?(permission) && project_ids.any? | |
|
209 | statement_by_role[role] = "#{Project.table_name}.id IN (#{project_ids.join(',')})" | |
|
210 | 210 | end |
|
211 | 211 | end |
|
212 | 212 | if statement_by_role.empty? |
@@ -163,6 +163,7 class User < Principal | |||
|
163 | 163 | def reload(*args) |
|
164 | 164 | @name = nil |
|
165 | 165 | @projects_by_role = nil |
|
166 | @project_ids_by_role = nil | |
|
166 | 167 | @membership_by_project_id = nil |
|
167 | 168 | @notified_projects_ids = nil |
|
168 | 169 | @notified_projects_ids_changed = false |
@@ -564,33 +565,51 class User < Principal | |||
|
564 | 565 | end |
|
565 | 566 | |
|
566 | 567 | # Returns a hash of user's projects grouped by roles |
|
568 | # TODO: No longer used, should be deprecated | |
|
567 | 569 | def projects_by_role |
|
568 | 570 | return @projects_by_role if @projects_by_role |
|
569 | 571 | |
|
570 |
|
|
|
572 | result = Hash.new([]) | |
|
573 | project_ids_by_role.each do |role, ids| | |
|
574 | result[role] = Project.where(:id => ids).to_a | |
|
575 | end | |
|
576 | @projects_by_role = result | |
|
577 | end | |
|
578 | ||
|
579 | # Returns a hash of project ids grouped by roles. | |
|
580 | # Includes the projects that the user is a member of and the projects | |
|
581 | # that grant custom permissions to the builtin groups. | |
|
582 | def project_ids_by_role | |
|
583 | return @project_ids_by_role if @project_ids_by_role | |
|
571 | 584 | |
|
572 | 585 | group_class = anonymous? ? GroupAnonymous : GroupNonMember |
|
573 | members = Member.joins(:project, :principal). | |
|
586 | group_id = group_class.pluck(:id).first | |
|
587 | ||
|
588 | members = Member.joins(:project, :member_roles). | |
|
574 | 589 | where("#{Project.table_name}.status <> 9"). |
|
575 |
where("#{Member.table_name}.user_id = ? OR (#{Project.table_name}.is_public = ? AND #{ |
|
|
576 | preload(:project, :roles). | |
|
577 | to_a | |
|
578 | ||
|
579 | members.reject! {|member| member.user_id != id && project_ids.include?(member.project_id)} | |
|
580 | members.each do |member| | |
|
581 | if member.project | |
|
582 | member.roles.each do |role| | |
|
583 | hash[role] = [] unless hash.key?(role) | |
|
584 | hash[role] << member.project | |
|
585 | end | |
|
586 | end | |
|
587 | end | |
|
590 | where("#{Member.table_name}.user_id = ? OR (#{Project.table_name}.is_public = ? AND #{Member.table_name}.user_id = ?)", self.id, true, group_id). | |
|
591 | pluck(:user_id, :role_id, :project_id) | |
|
592 | ||
|
593 | hash = {} | |
|
594 | members.each do |user_id, role_id, project_id| | |
|
595 | # Ignore the roles of the builtin group if the user is a member of the project | |
|
596 | next if user_id != id && project_ids.include?(project_id) | |
|
588 | 597 | |
|
589 | hash.each do |role, projects| | |
|
590 | projects.uniq! | |
|
598 | hash[role_id] ||= [] | |
|
599 | hash[role_id] << project_id | |
|
591 | 600 | end |
|
592 | 601 | |
|
593 | @projects_by_role = hash | |
|
602 | result = Hash.new([]) | |
|
603 | if hash.present? | |
|
604 | roles = Role.where(:id => hash.keys).to_a | |
|
605 | hash.each do |role_id, proj_ids| | |
|
606 | role = roles.detect {|r| r.id == role_id} | |
|
607 | if role | |
|
608 | result[role] = proj_ids.uniq | |
|
609 | end | |
|
610 | end | |
|
611 | end | |
|
612 | @project_ids_by_role = result | |
|
594 | 613 | end |
|
595 | 614 | |
|
596 | 615 | # Returns the ids of visible projects |
General Comments 0
You need to be logged in to leave comments.
Login now