Skip to content
Snippets Groups Projects
person.rb 5.14 KiB
Newer Older
pabois's avatar
pabois committed
# == Schema Information
#
Sébastien Gaya's avatar
Sébastien Gaya committed
# Table name: university_people
pabois's avatar
pabois committed
#
#  id                :uuid             not null, primary key
Sébastien Gaya's avatar
Sébastien Gaya committed
#  biography         :text
#  description       :text
pabois's avatar
pabois committed
#  email             :string
pabois's avatar
pabois committed
#  first_name        :string
Sébastien Gaya's avatar
Sébastien Gaya committed
#  habilitation      :boolean          default(FALSE)
#  is_administration :boolean
Arnaud Levy's avatar
Arnaud Levy committed
#  is_alumnus        :boolean          default(FALSE)
pabois's avatar
pabois committed
#  is_researcher     :boolean
#  is_teacher        :boolean
#  last_name         :string
#  linkedin          :string
pabois's avatar
pabois committed
#  phone             :string
pabois's avatar
pabois committed
#  slug              :string
Sébastien Gaya's avatar
Sébastien Gaya committed
#  tenure            :boolean          default(FALSE)
#  twitter           :string
#  url               :string
pabois's avatar
pabois committed
#  created_at        :datetime         not null
#  updated_at        :datetime         not null
pabois's avatar
pabois committed
#  university_id     :uuid             not null, indexed
#  user_id           :uuid             indexed
pabois's avatar
pabois committed
#
# Indexes
#
Sébastien Gaya's avatar
Sébastien Gaya committed
#  index_university_people_on_university_id  (university_id)
#  index_university_people_on_user_id        (user_id)
pabois's avatar
pabois committed
#
# Foreign Keys
#
Arnaud Levy's avatar
Arnaud Levy committed
#  fk_rails_b47a769440  (user_id => users.id)
#  fk_rails_da35e70d61  (university_id => universities.id)
pabois's avatar
pabois committed
#
Sébastien Gaya's avatar
Sébastien Gaya committed
class University::Person < ApplicationRecord
pabois's avatar
pabois committed
  include Sanitizable
Arnaud Levy's avatar
Arnaud Levy committed
  include WithUniversity
Arnaud Levy's avatar
Arnaud Levy committed
  include WithGit
  include WithBlobs
pabois's avatar
pabois committed
  include WithSlug
  include WithPicture
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithEducation
pabois's avatar
pabois committed

Sébastien Gaya's avatar
Sébastien Gaya committed
  has_summernote :biography
pabois's avatar
pabois committed

  belongs_to :user, optional: true

pabois's avatar
pabois committed
  has_and_belongs_to_many :research_journal_articles,
                          class_name: 'Research::Journal::Article',
                          join_table: :research_journal_articles_researchers,
                          foreign_key: :researcher_id

Arnaud Levy's avatar
Arnaud Levy committed
  has_many                :communication_website_posts,
                          class_name: 'Communication::Website::Post',
                          foreign_key: :author_id,
                          dependent: :nullify

Sébastien Gaya's avatar
Sébastien Gaya committed
  has_many                :communication_website_imported_authors,
Sébastien Gaya's avatar
Sébastien Gaya committed
                          class_name: "Communication::Website::Imported::Author",
Sébastien Gaya's avatar
Sébastien Gaya committed
                          foreign_key: :author_id,
                          dependent: :destroy

  has_many                :involvements,
                          class_name: 'University::Person::Involvement',
                          dependent: :destroy

Sébastien Gaya's avatar
Sébastien Gaya committed
  has_many                :involvements_as_administrator,
                          -> { where(kind: 'administrator') },
                          class_name: 'University::Person::Involvement',
                          dependent: :destroy

pabois's avatar
pabois committed
  has_many                :author_websites,
Arnaud Levy's avatar
Arnaud Levy committed
                          -> { distinct },
                          through: :communication_website_posts,
                          source: :website

pabois's avatar
pabois committed
  has_many                :researcher_websites,
Arnaud Levy's avatar
Arnaud Levy committed
                          -> { distinct },
                          through: :research_journal_articles,
                          source: :websites

pabois's avatar
pabois committed
  has_many                :teacher_websites,
Arnaud Levy's avatar
Arnaud Levy committed
                          -> { distinct },
                          through: :education_programs,
                          source: :websites

  accepts_nested_attributes_for :involvements
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
  validates_presence_of   :first_name, :last_name
  validates_uniqueness_of :email,
                          scope: :university_id,
                          allow_blank: true,
                          if: :will_save_change_to_email?
  validates_format_of     :email,
                          with: Devise::email_regexp,
                          allow_blank: true,
                          if: :will_save_change_to_email?

Sébastien Gaya's avatar
Sébastien Gaya committed
  before_validation :sanitize_email
Arnaud Levy's avatar
Arnaud Levy committed

  scope :ordered,         -> { order(:last_name, :first_name) }
  scope :administration, -> { where(is_administration: true) }
Arnaud Levy's avatar
Arnaud Levy committed
  scope :teachers,        -> { where(is_teacher: true) }
  scope :researchers,     -> { where(is_researcher: true) }
pabois's avatar
pabois committed

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

  def websites
    university.communication_websites
pabois's avatar
pabois committed
  end

  def git_path(website)
    "content/persons/#{slug}.html" if for_website?(website)
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def git_dependencies(website)
pabois's avatar
pabois committed
    dependencies = website.menus
    if for_website?(website)
      dependencies << self
      dependencies.concat active_storage_blobs
    dependencies << administrator if administrator.for_website?(website)
    dependencies << author if author.for_website?(website)
    dependencies << researcher if researcher.for_website?(website)
    dependencies << teacher if teacher.for_website?(website)
    dependencies
pabois's avatar
pabois committed
  end

  def administrator
    @administrator ||= University::Person::Administrator.find(id)
pabois's avatar
pabois committed
  end

  def author
    @author ||= University::Person::Author.find(id)
pabois's avatar
pabois committed
  end

  def researcher
    @researcher ||= University::Person::Researcher.find(id)
pabois's avatar
pabois committed
  end

  def teacher
    @teacher ||= University::Person::Teacher.find(id)
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def for_website?(website)
Arnaud Levy's avatar
Arnaud Levy committed
    in_block_dependencies?(website) ||
    administrator.for_website?(website) ||
    author.for_website?(website) ||
    researcher.for_website?(website) ||
    teacher.for_website?(website)
Sébastien Gaya's avatar
Sébastien Gaya committed

  protected

  def explicit_blob_ids
    [picture&.blob_id]
  end

  def inherited_blob_ids
    [best_picture&.blob_id]
  end

Sébastien Gaya's avatar
Sébastien Gaya committed
  def sanitize_email
    self.email = self.email.to_s.downcase.strip
Sébastien Gaya's avatar
Sébastien Gaya committed
  end
pabois's avatar
pabois committed
end