Skip to content
Snippets Groups Projects
page.rb 3.42 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
# == Schema Information
#
# Table name: communication_website_pages
#
#  id                       :uuid             not null, primary key
#  about_type               :string
#  description              :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  featured_image_alt       :string
Arnaud Levy's avatar
Arnaud Levy committed
#  github_path              :text
pabois's avatar
pabois committed
#  old_text                 :text
Arnaud Levy's avatar
Arnaud Levy committed
#  path                     :text
#  position                 :integer          default(0), not null
Arnaud Levy's avatar
Arnaud Levy committed
#  published                :boolean          default(FALSE)
Arnaud Levy's avatar
Arnaud Levy committed
#  slug                     :string
#  title                    :string
#  created_at               :datetime         not null
#  updated_at               :datetime         not null
#  about_id                 :uuid
#  communication_website_id :uuid             not null
#  parent_id                :uuid
Sébastien Gaya's avatar
Sébastien Gaya committed
#  related_category_id      :uuid
Arnaud Levy's avatar
Arnaud Levy committed
#  university_id            :uuid             not null
#
# Indexes
#
#  index_communication_website_pages_on_about                     (about_type,about_id)
#  index_communication_website_pages_on_communication_website_id  (communication_website_id)
#  index_communication_website_pages_on_parent_id                 (parent_id)
Sébastien Gaya's avatar
Sébastien Gaya committed
#  index_communication_website_pages_on_related_category_id       (related_category_id)
Arnaud Levy's avatar
Arnaud Levy committed
#  index_communication_website_pages_on_university_id             (university_id)
#
# Foreign Keys
#
#  fk_rails_...  (communication_website_id => communication_websites.id)
#  fk_rails_...  (parent_id => communication_website_pages.id)
Sébastien Gaya's avatar
Sébastien Gaya committed
#  fk_rails_...  (related_category_id => communication_website_categories.id)
Arnaud Levy's avatar
Arnaud Levy committed
#  fk_rails_...  (university_id => universities.id)
#

Arnaud Levy's avatar
Arnaud Levy committed
class Communication::Website::Page < ApplicationRecord
Arnaud Levy's avatar
Arnaud Levy committed
  include WithGit
  include WithMedia
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
pabois's avatar
pabois committed

pabois's avatar
pabois committed
  has_rich_text :text
  has_one_attached_deletable :featured_image

Arnaud Levy's avatar
Arnaud Levy committed
  belongs_to :university
Arnaud Levy's avatar
Arnaud Levy committed
  belongs_to :website,
             foreign_key: :communication_website_id
Sébastien Gaya's avatar
Sébastien Gaya committed
  belongs_to :related_category,
Sébastien Gaya's avatar
Sébastien Gaya committed
             class_name: 'Communication::Website::Category',
             optional: true
Arnaud Levy's avatar
Arnaud Levy committed
  belongs_to :parent,
             class_name: 'Communication::Website::Page',
             optional: true
pabois's avatar
pabois committed
  has_one    :imported_page,
             class_name: 'Communication::Website::Imported::Page',
             dependent: :nullify
Arnaud Levy's avatar
Arnaud Levy committed
  has_many   :children,
             class_name: 'Communication::Website::Page',
pabois's avatar
pabois committed
             foreign_key: :parent_id,
pabois's avatar
pabois committed
             dependent: :destroy
pabois's avatar
pabois committed

Arnaud Levy's avatar
Arnaud Levy committed
  validates :title, presence: true
Arnaud Levy's avatar
Arnaud Levy committed

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

pabois's avatar
pabois committed
  scope :ordered, -> { order(:position) }
Arnaud Levy's avatar
Arnaud Levy committed
  scope :recent, -> { order(updated_at: :desc).limit(5) }
pabois's avatar
pabois committed

Arnaud Levy's avatar
Arnaud Levy committed
  def git_path_static
Arnaud Levy's avatar
Arnaud Levy committed
    "content/pages/#{path}/_index.html".gsub(/\/+/, '/')
Arnaud Levy's avatar
Arnaud Levy committed
  end

pabois's avatar
pabois committed
  def list_of_other_pages
pabois's avatar
pabois committed
    website.list_of_pages.reject! { |p| p[:id] == id }
pabois's avatar
pabois committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def to_s
    "#{ title }"
Arnaud Levy's avatar
Arnaud Levy committed
  end

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 update_children_paths
    children.each do |child|
      child.update_column :path, child.generated_path
      child.update_children_paths
    end
  end

Arnaud Levy's avatar
Arnaud Levy committed
  protected

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