Skip to content
Snippets Groups Projects
program.rb 3.86 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
# == Schema Information
#
pabois's avatar
pabois committed
# Table name: education_programs
Arnaud Levy's avatar
Arnaud Levy committed
#
Sébastien Gaya's avatar
Sébastien Gaya committed
#  id                 :uuid             not null, primary key
#  capacity           :integer
#  continuing         :boolean
#  description        :text
#  ects               :integer
#  featured_image_alt :string
#  level              :integer
#  name               :string
#  path               :string
#  position           :integer          default(0)
#  published          :boolean          default(FALSE)
#  slug               :string
#  created_at         :datetime         not null
#  updated_at         :datetime         not null
#  parent_id          :uuid
#  university_id      :uuid             not null
Arnaud Levy's avatar
Arnaud Levy committed
#
# Indexes
#
pabois's avatar
pabois committed
#  index_education_programs_on_parent_id      (parent_id)
pabois's avatar
pabois committed
#  index_education_programs_on_university_id  (university_id)
Arnaud Levy's avatar
Arnaud Levy committed
#
# Foreign Keys
#
pabois's avatar
pabois committed
#  fk_rails_...  (parent_id => education_programs.id)
Arnaud Levy's avatar
Arnaud Levy committed
#  fk_rails_...  (university_id => universities.id)
#
Arnaud Levy's avatar
Arnaud Levy committed
class Education::Program < ApplicationRecord
Arnaud Levy's avatar
Arnaud Levy committed
  include WithGit
  include WithMedia
pabois's avatar
pabois committed
  include WithMenuItemTarget
Arnaud Levy's avatar
Arnaud Levy committed
  include WithSlug
pabois's avatar
pabois committed
  include WithTree
Arnaud Levy's avatar
Arnaud Levy committed
  include WithInheritance
pabois's avatar
pabois committed

Arnaud Levy's avatar
Arnaud Levy committed
  rich_text_areas_with_inheritance  :accessibility,
                                    :contacts,
                                    :duration,
                                    :evaluation,
                                    :objectives,
                                    :opportunities,
                                    :other,
                                    :pedagogy,
                                    :prerequisites,
                                    :pricing,
                                    :registration

Sébastien Gaya's avatar
Sébastien Gaya committed
  attr_accessor :skip_websites_categories_callback

Sébastien Gaya's avatar
Sébastien Gaya committed
  has_one_attached_deletable :featured_image
pabois's avatar
pabois committed

Arnaud Levy's avatar
Arnaud Levy committed
  belongs_to :university
pabois's avatar
pabois committed
  belongs_to :parent,
             class_name: 'Education::Program',
             optional: true
  has_many   :children,
             class_name: 'Education::Program',
             foreign_key: :parent_id,
pabois's avatar
pabois committed
             dependent: :destroy
  has_many   :members,
             class_name: 'Education::Program::Member',
             dependent: :destroy,
             inverse_of: :program
pabois's avatar
pabois committed
  has_and_belongs_to_many :schools,
                          class_name: 'Education::School',
                          join_table: 'education_programs_schools',
                          foreign_key: 'education_program_id',
                          association_foreign_key: 'education_school_id'
pabois's avatar
pabois committed
  has_and_belongs_to_many :teachers,
Sébastien Gaya's avatar
Sébastien Gaya committed
                          class_name: 'University::Person',
pabois's avatar
pabois committed
                          join_table: 'education_programs_teachers',
                          foreign_key: 'education_program_id',
                          association_foreign_key: 'education_teacher_id'
pabois's avatar
pabois committed
  has_many :websites, -> { distinct }, through: :schools
Arnaud Levy's avatar
Arnaud Levy committed

  accepts_nested_attributes_for :members, allow_destroy: true

Arnaud Levy's avatar
Arnaud Levy committed
  enum level: {
pabois's avatar
pabois committed
    first_year: 100,
    second_year: 200,
    dut: 210,
Arnaud Levy's avatar
Arnaud Levy committed
    bachelor: 300,
    master: 500,
    doctor: 800
  }

  validates_presence_of :name

Sébastien Gaya's avatar
Sébastien Gaya committed
  after_save :update_children_paths, if: :saved_change_to_path?
Sébastien Gaya's avatar
Sébastien Gaya committed
  after_save_commit :set_websites_categories, unless: :skip_websites_categories_callback

  scope :published, -> { where(published: true) }
pabois's avatar
pabois committed
  scope :ordered, -> { order(:position) }

Arnaud Levy's avatar
Arnaud Levy committed
  def to_s
    "#{name}"
  end
pabois's avatar
pabois committed

Sébastien Gaya's avatar
Sébastien Gaya committed
  def best_featured_image(fallback: true)
    return featured_image if featured_image.attached?
    best_image = parent&.best_featured_image(fallback: false)
    best_image ||= featured_image if fallback
    best_image
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def git_path_static
Arnaud Levy's avatar
Arnaud Levy committed
    "content/programs/#{path}/_index.html".gsub(/\/+/, '/')
Sébastien Gaya's avatar
Sébastien Gaya committed
  end

Sébastien Gaya's avatar
Sébastien Gaya committed
  def git_dependencies_static
    active_storage_blobs
  end

pabois's avatar
pabois committed
  def update_children_paths
    children.each do |child|
      child.update_column :path, child.generated_path
      child.update_children_paths
    end
pabois's avatar
pabois committed
  end

Sébastien Gaya's avatar
Sébastien Gaya committed
  def set_websites_categories
Sébastien Gaya's avatar
Sébastien Gaya committed
    websites.find_each(&:set_programs_categories!)
Sébastien Gaya's avatar
Sébastien Gaya committed
  end
Arnaud Levy's avatar
Arnaud Levy committed
end