##// END OF EJS Templates
Introduce virtual MenuNodes (#15880)....
Introduce virtual MenuNodes (#15880). They are characterized by having a blank url. they will only be rendered if the user is authorized to see at least one of its children. they render as links which do nothing when clicked. Patch by Jan Schulz-Hofen. git-svn-id: http://svn.redmine.org/redmine/trunk@15501 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r14938:97a647c1e5d4
r15119:53710d80fc88
Show More
principal.rb
196 lines | 6.1 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Adds missing native eol properties....
r2781 # Redmine - project management software
Jean-Philippe Lang
Updates copyright for 2016....
r14856 # Copyright (C) 2006-2016 Jean-Philippe Lang
Jean-Philippe Lang
Adds missing native eol properties....
r2781 #
# 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.
Toshi MARUYAMA
remove trailing white-spaces from app/models/principal.rb....
r6755 #
Jean-Philippe Lang
Adds missing native eol properties....
r2781 # 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.
Toshi MARUYAMA
remove trailing white-spaces from app/models/principal.rb....
r6755 #
Jean-Philippe Lang
Adds missing native eol properties....
r2781 # 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.
class Principal < ActiveRecord::Base
Jean-Philippe Lang
set_table_name and set_locking_column are deprecated....
r9367 self.table_name = "#{table_name_prefix}users#{table_name_suffix}"
Jean-Philippe Lang
Adds missing native eol properties....
r2781
Jean-Philippe Lang
Moved user status constants to Principal model....
r10731 # Account statuses
STATUS_ANONYMOUS = 0
STATUS_ACTIVE = 1
STATUS_REGISTERED = 2
STATUS_LOCKED = 3
Jean-Philippe Lang
Validate status of users and groups....
r14938 class_attribute :valid_statuses
Jean-Philippe Lang
Adds missing native eol properties....
r2781 has_many :members, :foreign_key => 'user_id', :dependent => :destroy
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 has_many :memberships,
lambda {preload(:project, :roles).
joins(:project).
Jean-Philippe Lang
Fixed that Project.uniq.visible errors under certain conditions (#21182)....
r14475 where("#{Project.table_name}.status<>#{Project::STATUS_ARCHIVED}")},
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 :class_name => 'Member',
:foreign_key => 'user_id'
Jean-Philippe Lang
Adds missing native eol properties....
r2781 has_many :projects, :through => :memberships
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify
Jean-Philippe Lang
Adds missing native eol properties....
r2781
Jean-Philippe Lang
Validate status of users and groups....
r14938 validate :validate_status
Jean-Philippe Lang
Adds missing native eol properties....
r2781 # Groups and active users
Jean-Philippe Lang
Code cleanup....
r10765 scope :active, lambda { where(:status => STATUS_ACTIVE) }
Toshi MARUYAMA
remove trailing white-spaces from app/models/principal.rb....
r6755
Jean-Philippe Lang
Adds a role setting for controlling visibility of users: all or members of visible projects (#11724)....
r13202 scope :visible, lambda {|*args|
user = args.first || User.current
if user.admin?
all
else
view_all_active = false
if user.memberships.to_a.any?
view_all_active = user.memberships.any? {|m| m.roles.any? {|r| r.users_visibility == 'all'}}
else
view_all_active = user.builtin_role.users_visibility == 'all'
end
Toshi MARUYAMA
remove trailing white spaces from app/models/principal.rb...
r13940
Jean-Philippe Lang
Adds a role setting for controlling visibility of users: all or members of visible projects (#11724)....
r13202 if view_all_active
active
else
# self and members of visible projects
active.where("#{table_name}.id = ? OR #{table_name}.id IN (SELECT user_id FROM #{Member.table_name} WHERE project_id IN (?))",
user.id, user.visible_project_ids
)
end
end
}
Toshi MARUYAMA
model: replace Rails2 "named_scope" to Rails3 "scope"...
r9355 scope :like, lambda {|q|
Jean-Philippe Lang
Code cleanup....
r10578 q = q.to_s
Jean-Philippe Lang
Makes user autocompleters work with firstname and lastname....
r8755 if q.blank?
Jean-Philippe Lang
Code cleanup....
r10578 where({})
Jean-Philippe Lang
Makes user autocompleters work with firstname and lastname....
r8755 else
pattern = "%#{q}%"
Jean-Philippe Lang
Add support for multiple email addresses per user (#4244)....
r13504 sql = %w(login firstname lastname).map {|column| "LOWER(#{table_name}.#{column}) LIKE LOWER(:p)"}.join(" OR ")
sql << " OR #{table_name}.id IN (SELECT user_id FROM #{EmailAddress.table_name} WHERE LOWER(address) LIKE LOWER(:p))"
Jean-Philippe Lang
Makes user autocompleters work with firstname and lastname....
r8755 params = {:p => pattern}
if q =~ /^(.+)\s+(.+)$/
a, b = "#{$1}%", "#{$2}%"
Jean-Philippe Lang
Adds table name to the SQL clause used by Principale.like scope....
r10579 sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:a) AND LOWER(#{table_name}.lastname) LIKE LOWER(:b))"
sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:b) AND LOWER(#{table_name}.lastname) LIKE LOWER(:a))"
Jean-Philippe Lang
Makes user autocompleters work with firstname and lastname....
r8755 params.merge!(:a => a, :b => b)
end
Jean-Philippe Lang
Code cleanup....
r10578 where(sql, params)
Jean-Philippe Lang
Makes user autocompleters work with firstname and lastname....
r8755 end
Jean-Philippe Lang
Adds missing native eol properties....
r2781 }
Toshi MARUYAMA
remove trailing white-spaces from app/models/principal.rb....
r6755
Jean-Philippe Lang
Adds members of subprojects in assignee and author filters (#10126)....
r8627 # Principals that are members of a collection of projects
Toshi MARUYAMA
model: replace Rails2 "named_scope" to Rails3 "scope"...
r9355 scope :member_of, lambda {|projects|
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 projects = [projects] if projects.is_a?(Project)
if projects.blank?
Jean-Philippe Lang
Code cleanup....
r10580 where("1=0")
Jean-Philippe Lang
Adds members of subprojects in assignee and author filters (#10126)....
r8627 else
ids = projects.map(&:id)
Jean-Baptiste Barth
Improve performance of Principal.member_of scope...
r12864 active.where("#{Principal.table_name}.id IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids)
Jean-Philippe Lang
Adds members of subprojects in assignee and author filters (#10126)....
r8627 end
}
Jean-Philippe Lang
Fixed that the proposed users list may be empty when adding a project member (#10374)....
r9008 # Principals that are not members of projects
Toshi MARUYAMA
model: replace Rails2 "named_scope" to Rails3 "scope"...
r9355 scope :not_member_of, lambda {|projects|
Jean-Philippe Lang
Fixed that the proposed users list may be empty when adding a project member (#10374)....
r9008 projects = [projects] unless projects.is_a?(Array)
if projects.empty?
Jean-Philippe Lang
Code cleanup....
r10580 where("1=0")
Jean-Philippe Lang
Fixed that the proposed users list may be empty when adding a project member (#10374)....
r9008 else
ids = projects.map(&:id)
Jean-Philippe Lang
Code cleanup....
r10580 where("#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids)
Jean-Philippe Lang
Fixed that the proposed users list may be empty when adding a project member (#10374)....
r9008 end
}
Jean-Philippe Lang
Adds "sorted" scope to Principal and User and sort users/groups properly....
r11029 scope :sorted, lambda { order(*Principal.fields_for_order_statement)}
Jean-Philippe Lang
Adds members of subprojects in assignee and author filters (#10126)....
r8627
Jean-Philippe Lang
Fixed: NOT NULL constraint error when adding a group (#4632)....
r3229 before_create :set_default_empty_values
Eric Davis
Define Principal#name so all subclasses will have some sort of name when printed....
r3962
def name(formatter = nil)
to_s
end
Jean-Philippe Lang
Add support for multiple email addresses per user (#4244)....
r13504 def mail=(*args)
nil
end
def mail
nil
end
Jean-Philippe Lang
Adds a role setting for controlling visibility of users: all or members of visible projects (#11724)....
r13202 def visible?(user=User.current)
Principal.visible(user).where(:id => id).first == self
end
Jean-Philippe Lang
Adds a single controller for users and groups memberships and support for adding multiple projects at once (#11702)....
r13116 # Return true if the principal is a member of project
def member_of?(project)
projects.to_a.include?(project)
end
Jean-Philippe Lang
Adds missing native eol properties....
r2781 def <=>(principal)
Jean-Philippe Lang
Fixed potential error when sorting members without role (#10053)....
r8743 if principal.nil?
-1
elsif self.class.name == principal.class.name
Toshi MARUYAMA
use String#casecmp for case insensitive comparison (#20369)...
r14102 self.to_s.casecmp(principal.to_s)
Jean-Philippe Lang
Display users then groups on project memberships view (#4389)....
r3047 else
# groups after users
principal.class.name <=> self.class.name
end
Jean-Philippe Lang
Adds missing native eol properties....
r2781 end
Toshi MARUYAMA
remove trailing white-spaces from app/models/principal.rb....
r6755
Jean-Philippe Lang
Adds "sorted" scope to Principal and User and sort users/groups properly....
r11029 # Returns an array of fields names than can be used to make an order statement for principals.
# Users are sorted before Groups.
# Examples:
def self.fields_for_order_statement(table=nil)
table ||= table_name
columns = ['type DESC'] + (User.name_formatter[:order] - ['id']) + ['lastname', 'id']
columns.uniq.map {|field| "#{table}.#{field}"}
end
Jean-Philippe Lang
Moved implementation to Principal....
r14118 # Returns the principal that matches the keyword among principals
def self.detect_by_keyword(principals, keyword)
keyword = keyword.to_s
return nil if keyword.blank?
principal = nil
Jean-Philippe Lang
Find user by login then by email....
r14124 principal ||= principals.detect {|a| keyword.casecmp(a.login.to_s) == 0}
principal ||= principals.detect {|a| keyword.casecmp(a.mail.to_s) == 0}
Jean-Philippe Lang
Moved implementation to Principal....
r14118 if principal.nil? && keyword.match(/ /)
firstname, lastname = *(keyword.split) # "First Last Throwaway"
principal ||= principals.detect {|a|
a.is_a?(User) &&
firstname.casecmp(a.firstname.to_s) == 0 &&
lastname.casecmp(a.lastname.to_s) == 0
}
end
if principal.nil?
principal ||= principals.detect {|a| keyword.casecmp(a.name) == 0}
end
principal
end
Jean-Philippe Lang
Fixed: NOT NULL constraint error when adding a group (#4632)....
r3229 protected
Toshi MARUYAMA
remove trailing white-spaces from app/models/principal.rb....
r6755
Jean-Philippe Lang
Fixed: NOT NULL constraint error when adding a group (#4632)....
r3229 # Make sure we don't try to insert NULL values (see #4632)
def set_default_empty_values
self.login ||= ''
self.hashed_password ||= ''
self.firstname ||= ''
self.lastname ||= ''
true
end
Jean-Philippe Lang
Validate status of users and groups....
r14938
def validate_status
if status_changed? && self.class.valid_statuses.present?
unless self.class.valid_statuses.include?(status)
errors.add :status, :invalid
end
end
end
Jean-Philippe Lang
Adds missing native eol properties....
r2781 end
Jean-Philippe Lang
Adds buit-in groups to give specific permissions to anonymous and non members users per project (#17976)....
r13053
require_dependency "user"
require_dependency "group"