Skip to content
Snippets Groups Projects
user.rb 3.33 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
#  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
#  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
#  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
pabois's avatar
pabois committed
  has_one_attached_deletable :picture  # In this order, "resize avatar" callback will be fired after the others.
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithAuthentication
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

  belongs_to :university
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) }
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