Skip to content
Snippets Groups Projects
page.rb 5.18 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
# == Schema Information
#
# Table name: communication_website_pages
#
#  id                       :uuid             not null, primary key
pabois's avatar
pabois committed
#  bodyclass                :string
pabois's avatar
pabois committed
#  breadcrumb_title         :string
Sébastien Gaya's avatar
Sébastien Gaya committed
#  featured_image_alt       :string
Arnaud Levy's avatar
Arnaud Levy committed
#  featured_image_credit    :text
Arnaud Levy's avatar
Arnaud Levy committed
#  full_width               :boolean          default(FALSE)
pabois's avatar
pabois committed
#  header_text              :text
#  kind                     :integer
pabois's avatar
pabois committed
#  meta_description         :text
Arnaud Levy's avatar
Arnaud Levy committed
#  migration_identifier     :string
Arnaud Levy's avatar
Arnaud Levy committed
#  position                 :integer          default(0), not null
Arnaud Levy's avatar
Arnaud Levy committed
#  published                :boolean          default(FALSE)
pabois's avatar
pabois committed
#  slug                     :string           indexed
#  summary                  :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  text                     :text
Arnaud Levy's avatar
Arnaud Levy committed
#  title                    :string
Arnaud Levy's avatar
Arnaud Levy committed
#  created_at               :datetime         not null
#  updated_at               :datetime         not null
pabois's avatar
pabois committed
#  communication_website_id :uuid             not null, indexed
#  language_id              :uuid             not null, indexed
#  original_id              :uuid             indexed
pabois's avatar
pabois committed
#  parent_id                :uuid             indexed
#  university_id            :uuid             not null, indexed
Arnaud Levy's avatar
Arnaud Levy committed
#
# Indexes
#
#  index_communication_website_pages_on_communication_website_id  (communication_website_id)
pabois's avatar
pabois committed
#  index_communication_website_pages_on_language_id               (language_id)
#  index_communication_website_pages_on_original_id               (original_id)
Arnaud Levy's avatar
Arnaud Levy committed
#  index_communication_website_pages_on_parent_id                 (parent_id)
pabois's avatar
pabois committed
#  index_communication_website_pages_on_slug                      (slug)
Arnaud Levy's avatar
Arnaud Levy committed
#  index_communication_website_pages_on_university_id             (university_id)
#
# Foreign Keys
#
pabois's avatar
pabois committed
#  fk_rails_1a42003f06  (parent_id => communication_website_pages.id)
#  fk_rails_280107c62b  (communication_website_id => communication_websites.id)
#  fk_rails_304f57360f  (original_id => communication_website_pages.id)
pabois's avatar
pabois committed
#  fk_rails_d208d15a73  (university_id => universities.id)
Arnaud Levy's avatar
Arnaud Levy committed
class Communication::Website::Page < ApplicationRecord
pabois's avatar
pabois committed
  self.ignored_columns = %w(path)

Arnaud Levy's avatar
Arnaud Levy committed
  include AsDirectObject
pabois's avatar
pabois committed
  include Sanitizable
Arnaud Levy's avatar
Arnaud Levy committed
  include WithAccessibility
Arnaud Levy's avatar
Arnaud Levy committed
  include WithAutomaticMenus
pabois's avatar
pabois committed
  include WithBlobs
  include WithBlocks
Arnaud Levy's avatar
Arnaud Levy committed
  include WithDuplication
  include WithFeaturedImage
pabois's avatar
pabois committed
  include WithMenuItemTarget
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithPosition
pabois's avatar
pabois committed
  include WithTree
Arnaud Levy's avatar
Arnaud Levy committed
  include WithPermalink
Arnaud Levy's avatar
Arnaud Levy committed
  include WithType
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithTranslations
Arnaud Levy's avatar
Arnaud Levy committed
  # WithPath overwrite the git_path method defined in WithWebsites
  include WithPath
Arnaud Levy's avatar
Arnaud Levy committed
  include WithUniversity
pabois's avatar
pabois committed

  has_summernote :text # TODO: Remove text attribute

Arnaud Levy's avatar
Arnaud Levy committed
  belongs_to :parent,
             class_name: 'Communication::Website::Page',
             optional: true
  belongs_to :original,
             class_name: 'Communication::Website::Page',
             optional: true
  belongs_to :language
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
Sébastien Gaya's avatar
Sébastien Gaya committed
  has_many   :translations,
             class_name: 'Communication::Website::Page',
             foreign_key: :original_id
pabois's avatar
pabois committed

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

Arnaud Levy's avatar
Arnaud Levy committed
  scope :recent, -> { order(updated_at: :desc).limit(5) }
pabois's avatar
pabois committed
  scope :published, -> { where(published: true) }
Arnaud Levy's avatar
Arnaud Levy committed
  scope :ordered_by_title, -> { order(:title) }
pabois's avatar
pabois committed

Arnaud Levy's avatar
Arnaud Levy committed
  scope :for_search_term, -> (term) {
    where("
      unaccent(communication_website_pages.meta_description) ILIKE unaccent(:term) OR
      unaccent(communication_website_pages.summary) ILIKE unaccent(:term) OR
      unaccent(communication_website_pages.title) ILIKE unaccent(:term)
    ", term: "%#{sanitize_sql_like(term)}%")
  }
  scope :for_published, -> (published) { where(published: published == 'true') }
  scope :for_full_width, -> (full_width) { where(full_width: full_width == 'true') }
  
Arnaud Levy's avatar
Arnaud Levy committed
  def template_static
    "admin/communication/websites/pages/static"
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def dependencies
pabois's avatar
pabois committed
    calculated_dependencies = active_storage_blobs + blocks
    # children are used only if there is no block to display
pabois's avatar
pabois committed
    calculated_dependencies += children unless blocks.published.any?
pabois's avatar
pabois committed
    calculated_dependencies
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def references
Sébastien Gaya's avatar
Sébastien Gaya committed
    [parent] +
Sébastien Gaya's avatar
Sébastien Gaya committed
    website.menus +
Arnaud Levy's avatar
Arnaud Levy committed
    abouts_with_page_block
Arnaud Levy's avatar
Arnaud Levy committed
  def best_title
    breadcrumb_title.blank? ? title : breadcrumb_title
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def to_s
Sébastien Gaya's avatar
Sébastien Gaya committed
    "#{title}"
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def best_featured_image_source(fallback: true)
pabois's avatar
pabois committed
    # we don't want to fallback on homepage featured_image
    return self if featured_image.attached? || is_home? || parent&.is_home?
    parent&.best_featured_image_source
pabois's avatar
pabois committed
  end

  def best_bodyclass
    return bodyclass if bodyclass.present?
Arnaud Levy's avatar
Arnaud Levy committed
    parent&.best_bodyclass unless is_home? || parent&.is_home?
Sébastien Gaya's avatar
Sébastien Gaya committed
  def siblings
Arnaud Levy's avatar
Arnaud Levy committed
    self.class.unscoped
              .where(parent: parent, university: university, website: website)
              .where.not(id: id)
Arnaud Levy's avatar
Arnaud Levy committed
  protected

Arnaud Levy's avatar
Arnaud Levy committed
  def check_accessibility
Arnaud Levy's avatar
Arnaud Levy committed
    accessibility_merge_array blocks
Sébastien Gaya's avatar
Sébastien Gaya committed
  def last_ordered_element
Sébastien Gaya's avatar
Sébastien Gaya committed
    website.pages.where(parent_id: parent_id, language_id: language_id).ordered.last
Sébastien Gaya's avatar
Sébastien Gaya committed
  end

  def explicit_blob_ids
Sébastien Gaya's avatar
Sébastien Gaya committed
    super.concat [featured_image&.blob_id]
  end

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

  def abouts_with_page_block
    website.blocks.pages.collect(&:about)
  end
Arnaud Levy's avatar
Arnaud Levy committed
end