Skip to content
Snippets Groups Projects
program.rb 4.57 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 WithFeaturedImage
  include WithBlobs
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
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithPosition
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,
Arnaud Levy's avatar
Arnaud Levy committed
                                    :registration,
                                    :content,
                                    :results
Sébastien Gaya's avatar
Sébastien Gaya committed
  attr_accessor :skip_websites_categories_callback

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
Sébastien Gaya's avatar
Sébastien Gaya committed
  has_many   :teachers,
             class_name: 'Education::Program::Teacher',
             dependent: :destroy
  has_many   :university_people_through_teachers,
Sébastien Gaya's avatar
Sébastien Gaya committed
             through: :teachers,
Sébastien Gaya's avatar
Sébastien Gaya committed
  has_many   :roles,
             class_name: 'Education::Program::Role',
             dependent: :destroy
  has_many   :role_people,
             through: :roles,
pabois's avatar
fi  
pabois committed
             source: :people
  has_many   :university_people_through_roles,
             through: :role_people,
             source: :person
  has_many   :website_categories,
             class_name: 'Communication::Website::Category',
             dependent: :destroy
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_many :websites, -> { distinct }, through: :schools
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

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

  def git_path(website)
    "content/programs/#{path}/_index.html"
Sébastien Gaya's avatar
Sébastien Gaya committed
  end

  def git_dependencies(website)
    [self] +
    active_storage_blobs +
    university_people_through_teachers +
pabois's avatar
pabois committed
    university_people_through_teachers.map(&:teacher) +
    university_people_through_roles
pabois's avatar
pabois committed
    # TODO: les administrative via roles
  def git_destroy_dependencies(website)
    [self] +
Arnaud Levy's avatar
Arnaud Levy committed
    explicit_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
Sébastien Gaya's avatar
Sébastien Gaya committed

  protected

  def last_ordered_element
Arnaud Levy's avatar
Arnaud Levy committed
    university.education_programs.where(parent_id: parent_id).ordered.last
Sébastien Gaya's avatar
Sébastien Gaya committed
  end

  def explicit_blob_ids
Sébastien Gaya's avatar
Sébastien Gaya committed
    super.concat [featured_image&.blob_id]
  end

  def inherited_blob_ids
    [best_featured_image&.blob_id]
  end
Arnaud Levy's avatar
Arnaud Levy committed
end