Class: Member

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/member.rb

Overview

Redmine - project management software Copyright (C) 2006-2016 Jean-Philippe Lang

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Since:

  • 0.4.0

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.create_principal_memberships(principal, attributes) ⇒ Object

Creates memberships for principal with the attributes

  • project_ids : one or more project ids

  • role_ids : ids of the roles to give to each membership

Example:

Member.create_principal_memberships(user, :project_ids => [2, 5], :role_ids => [1, 3]

Since:

  • 3.0.0



170
171
172
173
174
175
176
177
178
179
180
181
# File 'app/models/member.rb', line 170

def self.create_principal_memberships(principal, attributes)
  members = []
  if attributes
    project_ids = Array.wrap(attributes[:project_ids] || attributes[:project_id])
    role_ids = attributes[:role_ids]
    project_ids.each do |project_id|
      members << Member.new(:principal => principal, :role_ids => role_ids, :project_id => project_id)
    end
    principal.members << members
  end
  members
end

.find_or_new(project, principal) ⇒ Object

Finds or initilizes a Member for the given project and principal

Since:

  • 2.3.0



184
185
186
187
188
189
190
191
# File 'app/models/member.rb', line 184

def self.find_or_new(project, principal)
  project_id = project.is_a?(Project) ? project.id : project
  principal_id = principal.is_a?(Principal) ? principal.id : principal

  member = Member.find_by_project_id_and_user_id(project_id, principal_id)
  member ||= Member.new(:project_id => project_id, :user_id => principal_id)
  member
end

Instance Method Details

#<=>(member) ⇒ Object

Since:

  • 0.7.0



66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'app/models/member.rb', line 66

def <=>(member)
  a, b = roles.sort, member.roles.sort
  if a == b
    if principal
      principal <=> member.principal
    else
      1
    end
  elsif a.any?
    b.any? ? a <=> b : -1
  else
    1
  end
end

#any_inherited_role?Boolean

Returns true if one of the member roles is inherited

Returns:

  • (Boolean)

Since:

  • 3.1.0



92
93
94
# File 'app/models/member.rb', line 92

def any_inherited_role?
  member_roles.any? {|mr| mr.inherited_from}
end

#base_reloadObject

Since:

  • 3.1.0



34
# File 'app/models/member.rb', line 34

alias :base_reload :reload

#base_role_ids=Object

Since:

  • 0.9.0



50
# File 'app/models/member.rb', line 50

alias :base_role_ids= :role_ids=

#deletable?(user = User.current) ⇒ Boolean

Returns true if the member is deletable by user

Returns:

  • (Boolean)

Since:

  • 0.9.0



111
112
113
114
115
116
117
# File 'app/models/member.rb', line 111

def deletable?(user=User.current)
  if any_inherited_role?
    false
  else
    roles & user.managed_roles(project) == roles
  end
end

#destroyObject

Destroys the member

Since:

  • 2.5.2



120
121
122
123
# File 'app/models/member.rb', line 120

def destroy
  member_roles.reload.each(&:destroy_without_member_removal)
  super
end

#has_inherited_role?(role) ⇒ Boolean

Returns true if the member has the role and if it's inherited

Returns:

  • (Boolean)

Since:

  • 3.1.0



97
98
99
# File 'app/models/member.rb', line 97

def has_inherited_role?(role)
  member_roles.any? {|mr| mr.role_id == role.id && mr.inherited_from.present?}
end

#include?(user) ⇒ Boolean

Returns true if the member is user or is a group that includes user

Returns:

  • (Boolean)

Since:

  • 0.9.0



127
128
129
130
131
132
133
# File 'app/models/member.rb', line 127

def include?(user)
  if principal.is_a?(Group)
    !user.nil? && user.groups.include?(principal)
  else
    self.user == user
  end
end

#managed_rolesObject

Returns the roles that the member is allowed to manage in the project the member belongs to

Since:

  • 3.1.0



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'app/models/member.rb', line 145

def managed_roles
  @managed_roles ||= begin
    if principal.try(:admin?)
      Role.givable.to_a
    else
      members_management_roles = roles.select do |role|
        role.has_permission?(:manage_members)
      end
      if members_management_roles.empty?
        []
      elsif members_management_roles.any?(&:all_roles_managed?)
        Role.givable.to_a
      else
        members_management_roles.map(&:managed_roles).reduce(&:|)
      end
    end
  end
end

#nameObject



46
47
48
# File 'app/models/member.rb', line 46

def name
  self.user.name
end

#reload(*args) ⇒ Object

Since:

  • 3.1.0



35
36
37
38
# File 'app/models/member.rb', line 35

def reload(*args)
  @managed_roles = nil
  base_reload(*args)
end

#roleObject

Since:

  • 1.4.0



40
41
# File 'app/models/member.rb', line 40

def role
end

#role=Object

Since:

  • 1.4.0



43
44
# File 'app/models/member.rb', line 43

def role=
end

#role_editable?(role, user = User.current) ⇒ Boolean

Returns true if the member's role is editable by user

Returns:

  • (Boolean)

Since:

  • 3.1.0



102
103
104
105
106
107
108
# File 'app/models/member.rb', line 102

def role_editable?(role, user=User.current)
  if has_inherited_role?(role)
    false
  else
    user.managed_roles(project).include?(role)
  end
end

#role_ids=(arg) ⇒ Object

Since:

  • 0.9.0



51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'app/models/member.rb', line 51

def role_ids=(arg)
  ids = (arg || []).collect(&:to_i) - [0]
  # Keep inherited roles
  ids += member_roles.select {|mr| !mr.inherited_from.nil?}.collect(&:role_id)

  new_role_ids = ids - role_ids
  # Add new roles
  new_role_ids.each {|id| member_roles << MemberRole.new(:role_id => id, :member => self) }
  # Remove roles (Rails' #role_ids= will not trigger MemberRole#on_destroy)
  member_roles_to_destroy = member_roles.select {|mr| !ids.include?(mr.role_id)}
  if member_roles_to_destroy.any?
    member_roles_to_destroy.each(&:destroy)
  end
end

#set_editable_role_ids(ids, user = User.current) ⇒ Object

Set member role ids ignoring any change to roles that user is not allowed to manage

Since:

  • 3.1.0



83
84
85
86
87
88
89
# File 'app/models/member.rb', line 83

def set_editable_role_ids(ids, user=User.current)
  ids = (ids || []).collect(&:to_i) - [0]
  editable_role_ids = user.managed_roles(project).map(&:id)
  untouched_role_ids = self.role_ids - editable_role_ids
  touched_role_ids = ids & editable_role_ids
  self.role_ids = untouched_role_ids + touched_role_ids
end

#set_issue_category_nilObject

Since:

  • 1.4.0



135
136
137
138
139
140
141
# File 'app/models/member.rb', line 135

def set_issue_category_nil
  if user_id && project_id
    # remove category based auto assignments for this member
    IssueCategory.where(["project_id = ? AND assigned_to_id = ?", project_id, user_id]).
      update_all("assigned_to_id = NULL")
  end
end