Skip to content
Snippets Groups Projects
category.rb 3.15 KiB
Newer Older
pabois's avatar
pabois committed
# == Schema Information
#
# Table name: communication_website_categories
#
#  id                       :uuid             not null, primary key
#  description              :text
pabois's avatar
pabois committed
#  github_path              :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  is_programs_root         :boolean          default(FALSE)
pabois's avatar
pabois committed
#  name                     :string
#  position                 :integer
pabois's avatar
pabois committed
#  slug                     :string
pabois's avatar
pabois committed
#  created_at               :datetime         not null
#  updated_at               :datetime         not null
#  communication_website_id :uuid             not null
pabois's avatar
pabois committed
#  parent_id                :uuid
Sébastien Gaya's avatar
Sébastien Gaya committed
#  program_id               :uuid
pabois's avatar
pabois committed
#  university_id            :uuid             not null
#
# Indexes
#
#  idx_communication_website_post_cats_on_communication_website_id  (communication_website_id)
pabois's avatar
pabois committed
#  index_communication_website_categories_on_parent_id              (parent_id)
Sébastien Gaya's avatar
Sébastien Gaya committed
#  index_communication_website_categories_on_program_id             (program_id)
pabois's avatar
pabois committed
#  index_communication_website_categories_on_university_id          (university_id)
#
# Foreign Keys
#
#  fk_rails_...  (communication_website_id => communication_websites.id)
pabois's avatar
pabois committed
#  fk_rails_...  (parent_id => communication_website_categories.id)
Sébastien Gaya's avatar
Sébastien Gaya committed
#  fk_rails_...  (program_id => education_programs.id)
pabois's avatar
pabois committed
#  fk_rails_...  (university_id => universities.id)
#
class Communication::Website::Category < ApplicationRecord
pabois's avatar
pabois committed
  include WithGithub
pabois's avatar
pabois committed
  include WithSlug
pabois's avatar
pabois committed
  include WithTree
pabois's avatar
pabois committed

  belongs_to :university
  belongs_to :website,
             foreign_key: :communication_website_id
pabois's avatar
pabois committed
  belongs_to :parent,
            class_name: 'Communication::Website::Category',
            optional: true
Sébastien Gaya's avatar
Sébastien Gaya committed
  belongs_to :program,
            class_name: 'Education::Program',
            optional: true
pabois's avatar
pabois committed
  has_one :imported_category,
          class_name: 'Communication::Website::Imported::Category',
          dependent: :destroy
  has_many :children,
           class_name: 'Communication::Website::Category',
           foreign_key: :parent_id,
           dependent: :destroy
pabois's avatar
pabois committed
  has_and_belongs_to_many :posts,
                          class_name: 'Communication::Website::Post',
                          join_table: 'communication_website_categories_posts',
                          foreign_key: 'communication_website_category_id',
                          association_foreign_key: 'communication_website_post_id'
pabois's avatar
pabois committed

pabois's avatar
pabois committed

pabois's avatar
pabois committed
  validates :name, presence: true

  scope :ordered, -> { order(:position) }

  before_create :set_position

pabois's avatar
pabois committed
  def list_of_other_categories
    categories = []
    website.categories.where.not(id: id).root.ordered.each do |category|
      categories.concat(category.self_and_children(0))
    end
    categories.reject! { |p| p[:id] == id }
    categories
  end
pabois's avatar
pabois committed

  def to_s
    "#{name}"
  end

pabois's avatar
pabois committed
  def github_path_generated
    "_categories/#{slug}.html"
  end

  def to_jekyll
    ApplicationController.render(
      template: 'admin/communication/website/categories/jekyll',
      layout: false,
      assigns: { category: self }
    )
  end

pabois's avatar
pabois committed
  protected

  def set_position
Sébastien Gaya's avatar
Sébastien Gaya committed
    last_element = website.categories.where(parent_id: parent_id).ordered.last
pabois's avatar
pabois committed

    unless last_element.nil?
      self.position = last_element.position + 1
    else
      self.position = 1
    end
  end

end