Skip to content
Snippets Groups Projects
category.rb 4.26 KiB
Newer Older
pabois's avatar
pabois committed
# == Schema Information
#
# Table name: communication_website_categories
#
#  id                       :uuid             not null, primary key
#  description              :text
Arnaud Levy's avatar
Arnaud Levy committed
#  featured_image_alt       :string
Arnaud Levy's avatar
Arnaud Levy committed
#  featured_image_credit    :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
Arnaud Levy's avatar
Arnaud Levy committed
#  path                     :string
pabois's avatar
pabois committed
#  position                 :integer
pabois's avatar
pabois committed
#  slug                     :string
sebousan's avatar
sebousan committed
#  text                     :text
pabois's avatar
pabois committed
#  created_at               :datetime         not null
#  updated_at               :datetime         not null
pabois's avatar
pabois committed
#  communication_website_id :uuid             not null, indexed
#  parent_id                :uuid             indexed
#  program_id               :uuid             indexed
#  university_id            :uuid             not null, indexed
pabois's avatar
pabois committed
#
# 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
#
pabois's avatar
pabois committed
#  fk_rails_86a9ce3cea  (parent_id => communication_website_categories.id)
#  fk_rails_9d4210dc43  (university_id => universities.id)
#  fk_rails_c7c9f7ddc7  (communication_website_id => communication_websites.id)
#  fk_rails_e58348b119  (program_id => education_programs.id)
pabois's avatar
pabois committed
#
class Communication::Website::Category < 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
Arnaud Levy's avatar
Arnaud Levy committed
  include WithFeaturedImage
  include WithBlobs
pabois's avatar
pabois committed
  include WithMenuItemTarget
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithSlug # We override slug_unavailable? method
pabois's avatar
pabois committed
  include WithTree
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithPosition
pabois's avatar
pabois committed

Arnaud Levy's avatar
Arnaud Levy committed
  has_one                 :imported_category,
                          class_name: 'Communication::Website::Imported::Category',
                          dependent: :destroy
  belongs_to              :university
  belongs_to              :website,
                          foreign_key: :communication_website_id
  belongs_to              :parent,
                          class_name: 'Communication::Website::Category',
                          optional: true
  belongs_to              :program,
                          class_name: 'Education::Program',
                          optional: true
  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

Sébastien Gaya's avatar
Sébastien Gaya committed
  after_save :update_children_paths, if: :saved_change_to_path?

pabois's avatar
pabois committed
  def to_s
    "#{name}"
  end

  def git_path(website)
    "content/categories/#{path}/_index.html"
Arnaud Levy's avatar
Arnaud Levy committed
  def template_static
    "admin/communication/websites/categories/static"
  end

  def git_dependencies(website)
pabois's avatar
pabois committed
    [self] + descendants + active_storage_blobs + posts + website.menus
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def git_destroy_dependencies(website)
pabois's avatar
pabois committed
    [self] + descendants + active_storage_blobs
Arnaud Levy's avatar
Arnaud Levy committed
  end

Sébastien Gaya's avatar
Sébastien Gaya committed
  def update_children_paths
    children.each do |child|
      child.update_column :path, child.generated_path
      child.update_children_paths
    end
  end

Sébastien Gaya's avatar
Sébastien Gaya committed
  def siblings
    self.class.unscoped.where(parent: parent, university: university, website: website).where.not(id: id)
  end

pabois's avatar
pabois committed
  protected

Sébastien Gaya's avatar
Sébastien Gaya committed
  def last_ordered_element
    website.categories.where(parent_id: parent_id).ordered.last
pabois's avatar
pabois committed
  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
Arnaud Levy's avatar
Arnaud Levy committed

  def explicit_blob_ids
    super.concat [best_featured_image&.blob_id]
  end

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