app/models/user.rb
# -*- encoding : utf-8 -*-
# user is the system oriented representation of a User
class User < ActiveRecord::Base
include UserModules::Dropbox
include UserModules::TextSearch
include UserModules::AutoCompletion
has_secure_password validations: false
attr_accessor 'act_as_uberadmin'
default_scope { reorder(:login) }
after_save :update_searchable
after_save :update_trgm_searchable
# using a view here saves us from having a GROUP BY in the scope, which gives all sorts
# of problems when we try to chain further
scope :with_resources_amount, ->{
select("users.*, COALESCE(user_resources_counts.resouces_count,0) as resources_amount").
joins("LEFT OUTER JOIN user_resources_counts ON user_resources_counts.user_id = users.id") }
scope :sort_by_resouces_amount, ->{ reorder("resources_amount desc").order(:id)}
scope :order_by_last_name_first_name, ->{
joins(:person).reorder("people.last_name, people.first_name, people.pseudonym") }
scope :admin_users, ->{
joins(:admin_user)
}
belongs_to :person
delegate :name, :fullname, :shortname, :to => :person
has_one :admin_user, dependent: :destroy
has_many :userpermissions
has_many :media_resources
has_many :media_sets
has_many :media_entries
has_many :incomplete_media_entries, :class_name => "MediaEntryIncomplete", :dependent => :destroy
has_many :keywords
has_and_belongs_to_many :meta_data
has_many :created_custom_urls, class_name: 'CustomUrl', foreign_key: :creator_id
has_many :updated_custom_urls, class_name: 'CustomUrl', foreign_key: :updator_id
has_and_belongs_to_many :favorites, :class_name => "MediaResource", :join_table => "favorites" do
def toggle(media_resource)
if exists?(media_resource)
self.delete(media_resource)
else
self << media_resource
end
end
def favor(media_resource)
self << media_resource
end
def disfavor(media_resource)
self.delete(media_resource) if exists?(media_resource)
end
end
has_and_belongs_to_many :groups,
after_add: :increment_user_counter,
after_remove: :decrement_user_counter do
def is_member?(group)
group = Group.find_by_name(group) if group.is_a? String
group ? include?(group) : false
end
end
def is_admin?
!! admin_user
end
### counters ###################################################
def increment_user_counter(group)
group.increment!(:users_count)
end
def decrement_user_counter(group)
group.decrement!(:users_count)
end
#############################################################
def individual_contexts
# NOTE media_sets scope includes the subclasses (FilterSet)
r = MediaSet.media_sets.accessible_by_user(self,:view).select("media_resources.id")
Context.joins(:media_sets).uniq.where(:media_resources => {:id => r})
end
#############################################################
# NOTE login constraints are enforced on the db layer now
# NOTE contrary to what was noted previously here: ZHDK logins do only use ascii lowercase without
# umlauts etc, and sometimes numbers; nothing else! This information was given to me in Feb 2014.
# NOTE removed the old email validation; it was WAY to restrictive
# http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/
validates_format_of :email, :with => /@/, :message => "Email must contain a '@' sign."
#############################################################
def self.find_by_login(login)
where("login ilike ?",login).limit(1).first
end
def to_s
name
end
def login=(value)
write_attribute :login, (value ? value.downcase : nil)
end
def email=(value)
write_attribute :email, (value ? value.downcase : nil)
end
#############################################################
def authorized?(action, resource_or_resources)
Array(resource_or_resources).all? do |resource|
MediaResource.where(id: resource).
accessible_by_user(self,action).count > 0
end
end
#############################################################
def is_guest?
!persisted?
end
#############################################################
def usage_terms_accepted?
usage_terms_accepted_at.to_i >= UsageTerm.current.updated_at.to_i
end
def usage_terms_accepted!
update_attributes(:usage_terms_accepted_at => Time.now)
end
def reset_usage_terms
update_attributes(usage_terms_accepted_at: nil)
end
end