Skip to content
Snippets Groups Projects
program.rb 5.65 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
Sébastien Gaya's avatar
Sébastien Gaya committed
#  accessibility      :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  capacity           :integer
Sébastien Gaya's avatar
Sébastien Gaya committed
#  contacts           :text
#  content            :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  continuing         :boolean
#  description        :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  duration           :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  ects               :integer
Sébastien Gaya's avatar
Sébastien Gaya committed
#  evaluation         :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  featured_image_alt :string
#  level              :integer
#  name               :string
Sébastien Gaya's avatar
Sébastien Gaya committed
#  objectives         :text
#  opportunities      :text
#  other              :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  path               :string
Sébastien Gaya's avatar
Sébastien Gaya committed
#  pedagogy           :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  position           :integer          default(0)
Sébastien Gaya's avatar
Sébastien Gaya committed
#  prerequisites      :text
#  pricing            :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  published          :boolean          default(FALSE)
Sébastien Gaya's avatar
Sébastien Gaya committed
#  registration       :text
#  results            :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  slug               :string
#  created_at         :datetime         not null
#  updated_at         :datetime         not null
pabois's avatar
pabois committed
#  parent_id          :uuid             indexed
#  university_id      :uuid             not null, indexed
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
#
Arnaud Levy's avatar
Arnaud Levy committed
#  fk_rails_08b351087c  (university_id => universities.id)
pabois's avatar
pabois committed
#  fk_rails_ec1f16f607  (parent_id => education_programs.id)
Arnaud Levy's avatar
Arnaud Levy committed
#
Arnaud Levy's avatar
Arnaud Levy committed
class Education::Program < 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 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
Arnaud Levy's avatar
Arnaud Levy committed
  include WithBlocks
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

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   :university_roles,
             class_name: 'University::Role',
             as: :target,
             dependent: :destroy
  has_many   :involvements_through_roles,
             through: :university_roles,
             source: :involvements
  has_many   :university_people_through_role_involvements,
             through: :involvements_through_roles,
             source: :person
Sébastien Gaya's avatar
Sébastien Gaya committed
  has_many   :university_person_involvements,
             class_name: 'University::Person::Involvement',
             as: :target,
Sébastien Gaya's avatar
Sébastien Gaya committed
             inverse_of: :target,
Sébastien Gaya's avatar
Sébastien Gaya committed
             dependent: :destroy
  has_many   :university_people_through_involvements,
             through: :university_person_involvements,
             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

Sébastien Gaya's avatar
Sébastien Gaya committed
  accepts_nested_attributes_for :university_person_involvements, reject_if: :all_blank, allow_destroy: true

Arnaud Levy's avatar
Arnaud Levy committed
  enum level: {
Arnaud Levy's avatar
Arnaud Levy committed
    not_applicable: 0,
Arnaud Levy's avatar
Arnaud Levy committed
    primary: 40,
    secondary: 60,
    high: 80,
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 +
Arnaud Levy's avatar
Arnaud Levy committed
    git_block_dependencies +
    university_people_through_involvements +
Sébastien Gaya's avatar
Sébastien Gaya committed
    university_people_through_involvements.map(&:active_storage_blobs).flatten +
    university_people_through_involvements.map(&:teacher) +
    university_people_through_role_involvements +
Sébastien Gaya's avatar
Sébastien Gaya committed
    university_people_through_role_involvements.map(&:active_storage_blobs).flatten +
pabois's avatar
pabois committed
    university_people_through_role_involvements.map(&:administrator) +
    website.menus
  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