##// END OF EJS Templates
Remove hardcoded "Redmine" strings in account related emails. And use application title instead....
Remove hardcoded "Redmine" strings in account related emails. And use application title instead. git-svn-id: http://redmine.rubyforge.org/svn/trunk@1254 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r1217:3a75b6771fa1
r1239:a59e6bfb020f
Show More
user.rb
277 lines | 8.9 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # redMine - project management software
# Copyright (C) 2006-2007 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.
require "digest/sha1"
class User < ActiveRecord::Base
Jean-Philippe Lang
User's projects alphabetically sorted in the Projects drop down menu....
r535 # Account statuses
Jean-Philippe Lang
Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums....
r906 STATUS_ANONYMOUS = 0
Jean-Philippe Lang
User's projects alphabetically sorted in the Projects drop down menu....
r535 STATUS_ACTIVE = 1
STATUS_REGISTERED = 2
STATUS_LOCKED = 3
Jean-Philippe Lang
User display format is now configurable in administration settings....
r1089
USER_FORMATS = {
:firstname_lastname => '#{firstname} #{lastname}',
:firstname => '#{firstname}',
:lastname_firstname => '#{lastname} #{firstname}',
:lastname_coma_firstname => '#{lastname}, #{firstname}',
:username => '#{login}'
}
Jean-Philippe Lang
User's projects alphabetically sorted in the Projects drop down menu....
r535
Jean-Philippe Lang
Added the ability to archive projects:...
r546 has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :conditions => "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}", :order => "#{Project.table_name}.name", :dependent => :delete_all
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 has_many :projects, :through => :memberships
has_many :custom_values, :dependent => :delete_all, :as => :customized
Jean-Philippe Lang
Each category can now be associated to a user, so that new issues in that category are automatically assigned to that user....
r574 has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 has_one :preference, :dependent => :destroy, :class_name => 'UserPreference'
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 has_one :rss_token, :dependent => :destroy, :class_name => 'Token', :conditions => "action='feeds'"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 belongs_to :auth_source
attr_accessor :password, :password_confirmation
attr_accessor :last_before_login_on
# Prevents unauthorized assignments
attr_protected :login, :admin, :password, :password_confirmation, :hashed_password
Jean-Philippe Lang
Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums....
r906 validates_presence_of :login, :firstname, :lastname, :mail, :if => Proc.new { |user| !user.is_a?(AnonymousUser) }
Jean-Philippe Lang
Prevent 'has already been taken' error messages for user login and email if these fields are left empty....
r1029 validates_uniqueness_of :login, :if => Proc.new { |user| !user.login.blank? }
validates_uniqueness_of :mail, :if => Proc.new { |user| !user.mail.blank? }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # Login must contain lettres, numbers, underscores only
Jean-Philippe Lang
Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums....
r906 validates_format_of :login, :with => /^[a-z0-9_\-@\.]*$/i
Jean-Philippe Lang
Added some attributes length validations....
r397 validates_length_of :login, :maximum => 30
validates_format_of :firstname, :lastname, :with => /^[\w\s\'\-]*$/i
validates_length_of :firstname, :lastname, :maximum => 30
Jean-Philippe Lang
Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums....
r906 validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :allow_nil => true
validates_length_of :mail, :maximum => 60, :allow_nil => true
Jean-Philippe Lang
Removed the 12 characters limit on passwords....
r914 validates_length_of :password, :minimum => 4, :allow_nil => true
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 validates_confirmation_of :password, :allow_nil => true
validates_associated :custom_values, :on => :update
Jean-Philippe Lang
More flexible mail notifications settings at user level. A user has now 3 options:...
r842 def before_create
self.mail_notification = false
true
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def before_save
# update hashed_password if password was set
self.hashed_password = User.hash_password(self.password) if self.password
end
def self.active
with_scope :find => { :conditions => [ "status = ?", STATUS_ACTIVE ] } do
yield
end
end
def self.find_active(*args)
active do
find(*args)
end
end
# Returns the user that matches provided login and password, or nil
def self.try_to_login(login, password)
Jean-Philippe Lang
Prevent LDAP authentication with empty password related problems....
r1217 # Make sure no one can sign in with an empty password
return nil if password.to_s.empty?
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 user = find(:first, :conditions => ["login=?", login])
if user
# user is already in local database
return nil if !user.active?
if user.auth_source
# user has an external authentication method
return nil unless user.auth_source.authenticate(login, password)
else
# authentication with local password
return nil unless User.hash_password(password) == user.hashed_password
end
else
# user is not yet registered, try to authenticate with available sources
attrs = AuthSource.authenticate(login, password)
if attrs
onthefly = new(*attrs)
onthefly.login = login
onthefly.language = Setting.default_language
if onthefly.save
user = find(:first, :conditions => ["login=?", login])
logger.info("User '#{user.login}' created on the fly.") if logger
end
end
end
user.update_attribute(:last_login_on, Time.now) if user
user
rescue => text
raise text
end
# Return user's full name for display
Jean-Philippe Lang
User display format is now configurable in administration settings....
r1089 def name(formatter = nil)
f = USER_FORMATS[formatter || Setting.user_format] || USER_FORMATS[:firstname_lastname]
eval '"' + f + '"'
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
def active?
self.status == STATUS_ACTIVE
end
def registered?
self.status == STATUS_REGISTERED
end
def locked?
self.status == STATUS_LOCKED
end
def check_password?(clear_password)
User.hash_password(clear_password) == self.hashed_password
end
def pref
self.preference ||= UserPreference.new(:user => self)
end
Jean-Philippe Lang
added rss/atom feeds at project levels for:...
r336
Jean-Philippe Lang
* Added time zone support: users can select their time zone on their account view....
r904 def time_zone
self.pref.time_zone.nil? ? nil : TimeZone[self.pref.time_zone]
end
Jean-Philippe Lang
Add a user preference to choose how comments/replies are displayed: in chronological or reverse chronological order (#589, #776)....
r1183 def wants_comments_in_reverse_order?
self.pref[:comments_sorting] == 'desc'
end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 # Return user's RSS key (a 40 chars long string), used to access feeds
def rss_key
token = self.rss_token || Token.create(:user => self, :action => 'feeds')
token.value
Jean-Philippe Lang
added rss/atom feeds at project levels for:...
r336 end
Jean-Philippe Lang
More flexible mail notifications settings at user level. A user has now 3 options:...
r842 # Return an array of project ids for which the user has explicitly turned mail notifications on
def notified_projects_ids
@notified_projects_ids ||= memberships.select {|m| m.mail_notification?}.collect(&:project_id)
end
def notified_project_ids=(ids)
Member.update_all("mail_notification = #{connection.quoted_false}", ['user_id = ?', id])
Member.update_all("mail_notification = #{connection.quoted_true}", ['user_id = ? AND project_id IN (?)', id, ids]) if ids && !ids.empty?
@notified_projects_ids = nil
notified_projects_ids
end
Jean-Philippe Lang
added rss/atom feeds at project levels for:...
r336 def self.find_by_rss_key(key)
token = Token.find_by_value(key)
token && token.user.active? ? token.user : nil
end
Jean-Philippe Lang
Added autologin feature (disabled by default)....
r511
def self.find_by_autologin_key(key)
token = Token.find_by_action_and_value('autologin', key)
token && (token.created_on > Setting.autologin.to_i.day.ago) && token.user.active? ? token.user : nil
end
Jean-Philippe Lang
Various changes on views. On project summary, members are now grouped by role and subprojects are listed inline....
r431
def <=>(user)
Jean-Philippe Lang
User display format is now configurable in administration settings....
r1089 if user.nil?
-1
elsif lastname.to_s.downcase == user.lastname.to_s.downcase
firstname.to_s.downcase <=> user.firstname.to_s.downcase
else
lastname.to_s.downcase <=> user.lastname.to_s.downcase
end
Jean-Philippe Lang
Various changes on views. On project summary, members are now grouped by role and subprojects are listed inline....
r431 end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 def to_s
name
end
def logged?
true
end
# Return user's role for project
def role_for_project(project)
# No role on archived projects
return nil unless project && project.active?
Jean-Philippe Lang
Slight optimization in User#role_for_project....
r915 if logged?
# Find project membership
membership = memberships.detect {|m| m.project_id == project.id}
if membership
membership.role
else
@role_non_member ||= Role.non_member
end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 else
Jean-Philippe Lang
Slight optimization in User#role_for_project....
r915 @role_anonymous ||= Role.anonymous
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 end
end
# Return true if the user is a member of project
def member_of?(project)
role_for_project(project).member?
end
# Return true if the user is allowed to do the specified action on project
# action can be:
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
# * a permission Symbol (eg. :edit_project)
def allowed_to?(action, project)
Jean-Philippe Lang
Added project module concept....
r714 # No action allowed on archived projects
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 return false unless project.active?
Jean-Philippe Lang
Added project module concept....
r714 # No action allowed on disabled modules
return false unless project.allows_to?(action)
# Admin users are authorized for anything else
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 return true if admin?
Jean-Philippe Lang
Added project module concept....
r714
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 role = role_for_project(project)
return false unless role
role.allowed_to?(action) && (project.is_public? || role.member?)
end
def self.current=(user)
@current_user = user
end
def self.current
Jean-Philippe Lang
Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums....
r906 @current_user ||= User.anonymous
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 end
def self.anonymous
Jean-Philippe Lang
Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums....
r906 return @anonymous_user if @anonymous_user
anonymous_user = AnonymousUser.find(:first)
if anonymous_user.nil?
anonymous_user = AnonymousUser.create(:lastname => 'Anonymous', :firstname => '', :mail => '', :login => '', :status => 0)
raise 'Unable to create the anonymous user.' if anonymous_user.new_record?
end
@anonymous_user = anonymous_user
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 private
# Return password digest
def self.hash_password(clear_password)
Digest::SHA1.hexdigest(clear_password || "")
Jean-Philippe Lang
v0.2.0...
r5 end
Jean-Philippe Lang
Initial commit...
r2 end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663
class AnonymousUser < User
Jean-Philippe Lang
Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums....
r906 def validate_on_create
# There should be only one AnonymousUser in the database
errors.add_to_base 'An anonymous user already exists.' if AnonymousUser.find(:first)
Jean-Philippe Lang
* Added time zone support: users can select their time zone on their account view....
r904 end
Jean-Philippe Lang
Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums....
r906 # Overrides a few properties
def logged?; false end
def admin; false end
def name; 'Anonymous' end
def mail; nil end
def time_zone; nil end
def rss_key; nil end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 end