Skip to content
Snippets Groups Projects
category.rb 3.83 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
  include WithGithubFiles
pabois's avatar
pabois committed
  include WithMenuItemTarget
pabois's avatar
pabois committed
  include WithSlug
pabois's avatar
pabois committed
  include WithTree
pabois's avatar
pabois committed

pabois's avatar
pabois committed
  has_one :imported_category,
          class_name: 'Communication::Website::Imported::Category',
          dependent: :destroy
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

  validates :name, presence: true
  validates :slug, uniqueness: { scope: :communication_website_id }
pabois's avatar
pabois committed

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

  before_create :set_position

pabois's avatar
pabois committed
  def list_of_other_categories
Arnaud Levy's avatar
Arnaud Levy committed
    new_record? ? website.list_of_categories
                : website.list_of_categories.reject! { |p| p[:id] == id }
pabois's avatar
pabois committed
  end
pabois's avatar
pabois committed

  def to_s
    "#{name}"
  end

pabois's avatar
pabois committed
  def path
    # used in menu_item#jekyll_target
    "/#{website.posts_github_directory}/#{slug}"
  end

  # Override from WithGithubFiles
pabois's avatar
pabois committed
  def github_path_generated
    "#{website.posts_github_directory}/#{slug}.html"
  end

  def github_manifest
    super << {
      identifier: "collection_item",
pabois's avatar
pabois committed
      generated_path: -> (github_file) { "_data/categories/#{slug}.yml" },
      data: -> (github_file) { ApplicationController.render(
Sébastien Gaya's avatar
Sébastien Gaya committed
        template: "admin/communication/website/categories/jekyll_collection",
        formats: [:yml],
        layout: false,
Sébastien Gaya's avatar
Sébastien Gaya committed
        assigns: { category: self, github_file: github_file }
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

  def slug_unavailable?(slug)
    self.class.unscoped.where(communication_website_id: self.communication_website_id, slug: slug).where.not(id: self.id).exists?
  end
pabois's avatar
pabois committed
end