Skip to content
Snippets Groups Projects
user.rb 3.7 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
# == Schema Information
#
# Table name: users
#
Sébastien Gaya's avatar
Sébastien Gaya committed
#  id                            :uuid             not null, primary key
Arnaud Levy's avatar
Arnaud Levy committed
#  admin_theme                   :integer          default("appstack")
Sébastien Gaya's avatar
Sébastien Gaya committed
#  confirmation_sent_at          :datetime
pabois's avatar
pabois committed
#  confirmation_token            :string           indexed
Sébastien Gaya's avatar
Sébastien Gaya committed
#  confirmed_at                  :datetime
#  current_sign_in_at            :datetime
#  current_sign_in_ip            :string
#  direct_otp                    :string
pabois's avatar
pabois committed
#  direct_otp_delivery_method    :string
Sébastien Gaya's avatar
Sébastien Gaya committed
#  direct_otp_sent_at            :datetime
pabois's avatar
pabois committed
#  email                         :string           default(""), not null, indexed => [university_id]
#  encrypted_otp_secret_key      :string           indexed
Sébastien Gaya's avatar
Sébastien Gaya committed
#  encrypted_otp_secret_key_iv   :string
#  encrypted_otp_secret_key_salt :string
#  encrypted_password            :string           default(""), not null
#  failed_attempts               :integer          default(0), not null
#  first_name                    :string
#  last_name                     :string
#  last_sign_in_at               :datetime
#  last_sign_in_ip               :string
#  locked_at                     :datetime
#  mobile_phone                  :string
pabois's avatar
pabois committed
#  picture_url                   :string
Sébastien Gaya's avatar
Sébastien Gaya committed
#  remember_created_at           :datetime
#  reset_password_sent_at        :datetime
pabois's avatar
pabois committed
#  reset_password_token          :string           indexed
Sébastien Gaya's avatar
Sébastien Gaya committed
#  role                          :integer          default("visitor")
#  second_factor_attempts_count  :integer          default(0)
#  session_token                 :string
#  sign_in_count                 :integer          default(0), not null
#  totp_timestamp                :datetime
#  unconfirmed_email             :string
pabois's avatar
pabois committed
#  unlock_token                  :string           indexed
Sébastien Gaya's avatar
Sébastien Gaya committed
#  created_at                    :datetime         not null
#  updated_at                    :datetime         not null
pabois's avatar
pabois committed
#  language_id                   :uuid             indexed
#  university_id                 :uuid             not null, indexed => [email], indexed
Arnaud Levy's avatar
Arnaud Levy committed
#
# Indexes
#
Sébastien Gaya's avatar
Sébastien Gaya committed
#  index_users_on_confirmation_token        (confirmation_token) UNIQUE
#  index_users_on_email_and_university_id   (email,university_id) UNIQUE
#  index_users_on_encrypted_otp_secret_key  (encrypted_otp_secret_key) UNIQUE
#  index_users_on_language_id               (language_id)
#  index_users_on_reset_password_token      (reset_password_token) UNIQUE
#  index_users_on_university_id             (university_id)
#  index_users_on_unlock_token              (unlock_token) UNIQUE
pabois's avatar
pabois committed
#  fk_rails_45f4f12508  (language_id => languages.id)
#  fk_rails_bd6f7212a9  (university_id => universities.id)
Arnaud Levy's avatar
Arnaud Levy committed
#
class User < ApplicationRecord
  # We don't include Sanitizable because too many complex attributes.
  # The sanitization is handled in User::WithAuthentication's sanitize_fields method.
Arnaud Levy's avatar
Arnaud Levy committed
  include WithAdminTheme
pabois's avatar
pabois committed
  include WithAvatar
pabois's avatar
pabois committed
  include WithRegistrationContext
Arnaud Levy's avatar
Arnaud Levy committed
  include WithUniversity
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithAuthentication
pabois's avatar
pabois committed
  include WithOmniauth
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithPerson
pabois's avatar
pabois committed
  include WithRoles
pabois's avatar
pabois committed
  include WithSyncBetweenUniversities
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
  belongs_to :language
Arnaud Levy's avatar
Arnaud Levy committed

pabois's avatar
pabois committed
  scope :ordered, -> { order(:last_name, :first_name) }
pabois's avatar
pabois committed
  scope :for_language, -> (language_id) { where(language_id: language_id) }
Sébastien Gaya's avatar
Sébastien Gaya committed
  scope :for_search_term, -> (term) {
    where("
      unaccent(concat(users.first_name, ' ', users.last_name)) ILIKE unaccent(:term) OR
      unaccent(concat(users.last_name, ' ', users.first_name)) ILIKE unaccent(:term) OR
      unaccent(users.first_name) ILIKE unaccent(:term) OR
      unaccent(users.last_name) ILIKE unaccent(:term) OR
      unaccent(users.email) ILIKE unaccent(:term) OR
      unaccent(users.mobile_phone) ILIKE unaccent(:term)
    ", term: "%#{sanitize_sql_like(term)}%")
  }
pabois's avatar
pabois committed

Arnaud Levy's avatar
Arnaud Levy committed
  def to_s
    "#{first_name} #{last_name}"
Arnaud Levy's avatar
Arnaud Levy committed
  end
Arnaud Levy's avatar
Arnaud Levy committed
end