##// END OF EJS Templates
replace tabs to spaces (#16795)...
Toshi MARUYAMA -
r12867:5368af48479d
parent child
Show More
@@ -1,126 +1,126
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2014 Jean-Philippe Lang
2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Member < ActiveRecord::Base
18 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, :through => :member_roles
22 has_many :roles, :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
26 validates_uniqueness_of :user_id, :scope => :project_id
26 validates_uniqueness_of :user_id, :scope => :project_id
27 validate :validate_role
27 validate :validate_role
28
28
29 before_destroy :set_issue_category_nil
29 before_destroy :set_issue_category_nil
30
30
31 def role
31 def role
32 end
32 end
33
33
34 def role=
34 def role=
35 end
35 end
36
36
37 def name
37 def name
38 self.user.name
38 self.user.name
39 end
39 end
40
40
41 alias :base_role_ids= :role_ids=
41 alias :base_role_ids= :role_ids=
42 def role_ids=(arg)
42 def role_ids=(arg)
43 ids = (arg || []).collect(&:to_i) - [0]
43 ids = (arg || []).collect(&:to_i) - [0]
44 # Keep inherited roles
44 # Keep inherited roles
45 ids += member_roles.select {|mr| !mr.inherited_from.nil?}.collect(&:role_id)
45 ids += member_roles.select {|mr| !mr.inherited_from.nil?}.collect(&:role_id)
46
46
47 new_role_ids = ids - role_ids
47 new_role_ids = ids - role_ids
48 # Add new roles
48 # Add new roles
49 new_role_ids.each {|id| member_roles << MemberRole.new(:role_id => id) }
49 new_role_ids.each {|id| member_roles << MemberRole.new(:role_id => id) }
50 # Remove roles (Rails' #role_ids= will not trigger MemberRole#on_destroy)
50 # Remove roles (Rails' #role_ids= will not trigger MemberRole#on_destroy)
51 member_roles_to_destroy = member_roles.select {|mr| !ids.include?(mr.role_id)}
51 member_roles_to_destroy = member_roles.select {|mr| !ids.include?(mr.role_id)}
52 if member_roles_to_destroy.any?
52 if member_roles_to_destroy.any?
53 member_roles_to_destroy.each(&:destroy)
53 member_roles_to_destroy.each(&:destroy)
54 end
54 end
55 end
55 end
56
56
57 def <=>(member)
57 def <=>(member)
58 a, b = roles.sort.first, member.roles.sort.first
58 a, b = roles.sort.first, member.roles.sort.first
59 if a == b
59 if a == b
60 if principal
60 if principal
61 principal <=> member.principal
61 principal <=> member.principal
62 else
62 else
63 1
63 1
64 end
64 end
65 elsif a
65 elsif a
66 a <=> b
66 a <=> b
67 else
67 else
68 1
68 1
69 end
69 end
70 end
70 end
71
71
72 def deletable?
72 def deletable?
73 member_roles.detect {|mr| mr.inherited_from}.nil?
73 member_roles.detect {|mr| mr.inherited_from}.nil?
74 end
74 end
75
75
76 def destroy
76 def destroy
77 if member_roles.reload.present?
77 if member_roles.reload.present?
78 # destroying the last role will destroy another instance
78 # destroying the last role will destroy another instance
79 # of the same Member record, #super would then trigger callbacks twice
79 # of the same Member record, #super would then trigger callbacks twice
80 member_roles.destroy_all
80 member_roles.destroy_all
81 @destroyed = true
81 @destroyed = true
82 freeze
82 freeze
83 else
83 else
84 super
84 super
85 end
85 end
86 end
86 end
87
87
88 def include?(user)
88 def include?(user)
89 if principal.is_a?(Group)
89 if principal.is_a?(Group)
90 !user.nil? && user.groups.include?(principal)
90 !user.nil? && user.groups.include?(principal)
91 else
91 else
92 self.user == user
92 self.user == user
93 end
93 end
94 end
94 end
95
95
96 def set_issue_category_nil
96 def set_issue_category_nil
97 if user
97 if user
98 # remove category based auto assignments for this member
98 # remove category based auto assignments for this member
99 IssueCategory.where(["project_id = ? AND assigned_to_id = ?", project.id, user.id]).
99 IssueCategory.where(["project_id = ? AND assigned_to_id = ?", project.id, user.id]).
100 update_all("assigned_to_id = NULL")
100 update_all("assigned_to_id = NULL")
101 end
101 end
102 end
102 end
103
103
104 # Find or initialize a Member with an id, attributes, and for a Principal
104 # Find or initialize a Member with an id, attributes, and for a Principal
105 def self.edit_membership(id, new_attributes, principal=nil)
105 def self.edit_membership(id, new_attributes, principal=nil)
106 @membership = id.present? ? Member.find(id) : Member.new(:principal => principal)
106 @membership = id.present? ? Member.find(id) : Member.new(:principal => principal)
107 @membership.attributes = new_attributes
107 @membership.attributes = new_attributes
108 @membership
108 @membership
109 end
109 end
110
110
111 # Finds or initilizes a Member for the given project and principal
111 # Finds or initilizes a Member for the given project and principal
112 def self.find_or_new(project, principal)
112 def self.find_or_new(project, principal)
113 project_id = project.is_a?(Project) ? project.id : project
113 project_id = project.is_a?(Project) ? project.id : project
114 principal_id = principal.is_a?(Principal) ? principal.id : principal
114 principal_id = principal.is_a?(Principal) ? principal.id : principal
115
115
116 member = Member.find_by_project_id_and_user_id(project_id, principal_id)
116 member = Member.find_by_project_id_and_user_id(project_id, principal_id)
117 member ||= Member.new(:project_id => project_id, :user_id => principal_id)
117 member ||= Member.new(:project_id => project_id, :user_id => principal_id)
118 member
118 member
119 end
119 end
120
120
121 protected
121 protected
122
122
123 def validate_role
123 def validate_role
124 errors.add_on_empty :role if member_roles.empty? && roles.empty?
124 errors.add_on_empty :role if member_roles.empty? && roles.empty?
125 end
125 end
126 end
126 end
General Comments 0
You need to be logged in to leave comments. Login now