Skip to content
Snippets Groups Projects
program.rb 2.91 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
#
#  id            :uuid             not null, primary key
#  capacity      :integer
#  continuing    :boolean
#  ects          :integer
#  level         :integer
#  name          :string
Sébastien Gaya's avatar
Sébastien Gaya committed
#  path          :string
pabois's avatar
pabois committed
#  position      :integer          default(0)
Arnaud Levy's avatar
Arnaud Levy committed
#  created_at    :datetime         not null
#  updated_at    :datetime         not null
pabois's avatar
pabois committed
#  parent_id     :uuid
Arnaud Levy's avatar
Arnaud Levy committed
#  university_id :uuid             not null
#
# 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
  include WithGithubFiles
pabois's avatar
pabois committed
  include WithMenuItemTarget
pabois's avatar
pabois committed
  include WithTree

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

pabois's avatar
pabois committed
  has_rich_text :accessibility
  has_rich_text :contacts
  has_rich_text :duration
  has_rich_text :evaluation
  has_rich_text :objectives
pabois's avatar
pabois committed
  has_rich_text :opportunities
  has_rich_text :other
pabois's avatar
pabois committed
  has_rich_text :pedagogy
  has_rich_text :prerequisites
  has_rich_text :pricing
  has_rich_text :registration
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,
             dependent: :nullify
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,
pabois's avatar
pabois committed
                          class_name: 'Administration::Member',
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

  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
  before_validation :make_path
  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

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
  # Override from WithGithubFiles
  def github_path_generated
    "_programs/#{path}/index.html".gsub(/\/+/, '/')
  end

  def make_path
    self.path = "#{parent&.path}/#{slug}".gsub(/\/+/, '/')
  end

pabois's avatar
pabois committed
  def list_of_other_programs
    university.list_of_programs.reject! { |p| p[:id] == id }
  end
pabois's avatar
pabois committed

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