149 lines
4.3 KiB
Ruby
149 lines
4.3 KiB
Ruby
# encoding: utf-8
|
|
|
|
require 'digest/sha1'
|
|
# specific user rights through memberships (see Group)
|
|
class User < ActiveRecord::Base
|
|
include RailsSettings::Extend
|
|
#TODO: acts_as_paraniod ??
|
|
|
|
has_many :memberships, :dependent => :destroy
|
|
has_many :groups, :through => :memberships
|
|
#has_one :ordergroup, :through => :memberships, :source => :group, :class_name => "Ordergroup"
|
|
def ordergroup
|
|
Ordergroup.joins(:memberships).where(memberships: {user_id: self.id}).first
|
|
end
|
|
|
|
has_many :workgroups, :through => :memberships, :source => :group, :class_name => "Workgroup"
|
|
has_many :assignments, :dependent => :destroy
|
|
has_many :tasks, :through => :assignments
|
|
has_many :send_messages, :class_name => "Message", :foreign_key => "sender_id"
|
|
has_many :created_orders, :class_name => 'Order', :foreign_key => 'created_by_user_id', :dependent => :nullify
|
|
|
|
attr_accessor :password, :settings_attributes
|
|
|
|
# makes the current_user (logged-in-user) available in models
|
|
cattr_accessor :current_user
|
|
|
|
validates_presence_of :nick, :email
|
|
validates_presence_of :password, :on => :create
|
|
validates_length_of :nick, :in => 2..25
|
|
validates_uniqueness_of :nick, :case_sensitive => false
|
|
validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
|
|
validates_uniqueness_of :email, :case_sensitive => false
|
|
validates_length_of :first_name, :in => 2..50
|
|
validates_confirmation_of :password
|
|
validates_length_of :password, :in => 5..25, :allow_blank => true
|
|
|
|
before_validation :set_password
|
|
after_initialize do
|
|
settings.defaults['profile'] = { 'language' => I18n.default_locale } unless settings.profile
|
|
settings.defaults['messages'] = { 'send_as_email' => true } unless settings.messages
|
|
settings.defaults['notify'] = { 'upcoming_tasks' => true } unless settings.notify
|
|
end
|
|
|
|
after_save do
|
|
return if settings_attributes.nil?
|
|
settings_attributes.each do |key, value|
|
|
value.each do |k, v|
|
|
case v
|
|
when '1'
|
|
value[k] = true
|
|
when '0'
|
|
value[k] = false
|
|
end
|
|
end
|
|
self.settings.merge!(key, value)
|
|
end
|
|
end
|
|
|
|
def locale
|
|
settings.profile['language']
|
|
end
|
|
|
|
def name
|
|
[first_name, last_name].join(" ")
|
|
end
|
|
|
|
def receive_email?
|
|
settings.messages['send_as_email'] && email.present?
|
|
end
|
|
|
|
# Sets the user's password. It will be stored encrypted along with a random salt.
|
|
def set_password
|
|
unless password.blank?
|
|
salt = [Array.new(6){rand(256).chr}.join].pack("m").chomp
|
|
self.password_hash, self.password_salt = Digest::SHA1.hexdigest(password + salt), salt
|
|
end
|
|
end
|
|
|
|
# Returns true if the password argument matches the user's password.
|
|
def has_password(password)
|
|
Digest::SHA1.hexdigest(password + self.password_salt) == self.password_hash
|
|
end
|
|
|
|
# Returns a random password.
|
|
def new_random_password(size = 3)
|
|
c = %w(b c d f g h j k l m n p qu r s t v w x z ch cr fr nd ng nk nt ph pr rd sh sl sp st th tr)
|
|
v = %w(a e i o u y)
|
|
f, r = true, ''
|
|
(size * 2).times do
|
|
r << (f ? c[rand * c.size] : v[rand * v.size])
|
|
f = !f
|
|
end
|
|
r
|
|
end
|
|
|
|
# Checks the admin role
|
|
def role_admin?
|
|
groups.detect {|group| group.role_admin?}
|
|
end
|
|
|
|
# Checks the finance role
|
|
def role_finance?
|
|
groups.detect {|group| group.role_finance?}
|
|
end
|
|
|
|
# Checks the article_meta role
|
|
def role_article_meta?
|
|
groups.detect {|group| group.role_article_meta?}
|
|
end
|
|
|
|
# Checks the suppliers role
|
|
def role_suppliers?
|
|
groups.detect {|group| group.role_suppliers?}
|
|
end
|
|
|
|
# Checks the orders role
|
|
def role_orders?
|
|
groups.detect {|group| group.role_orders?}
|
|
end
|
|
|
|
def ordergroup_name
|
|
ordergroup ? ordergroup.name : I18n.t('model.user.no_ordergroup')
|
|
end
|
|
|
|
# returns true if user is a member of a given group
|
|
def member_of?(group)
|
|
group.users.exists?(self.id)
|
|
end
|
|
|
|
#Returns an array with the users groups (but without the Ordergroups -> because tpye=>"")
|
|
def member_of_groups()
|
|
self.groups.find(:all, :conditions => {:type => ""})
|
|
end
|
|
|
|
def self.authenticate(nick, password)
|
|
user = find_by_nick(nick)
|
|
if user && user.has_password(password)
|
|
user
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def token_attributes
|
|
{:id => id, :name => "#{nick} (#{ordergroup.try(:name)})"}
|
|
end
|
|
|
|
end
|
|
|