Skip to content
Snippets Groups Projects
menu.rb 3.15 KiB
Newer Older
Sébastien Gaya's avatar
Sébastien Gaya committed
# == Schema Information
#
# Table name: communication_website_menus
#
Sébastien Gaya's avatar
Sébastien Gaya committed
#  id                       :uuid             not null, primary key
Arnaud Levy's avatar
Arnaud Levy committed
#  automatic                :boolean          default(TRUE)
Sébastien Gaya's avatar
Sébastien Gaya committed
#  identifier               :string
#  title                    :string
#  created_at               :datetime         not null
#  updated_at               :datetime         not null
pabois's avatar
pabois committed
#  communication_website_id :uuid             not null, indexed
Sébastien Gaya's avatar
Sébastien Gaya committed
#  language_id              :uuid             not null, indexed
#  original_id              :uuid             indexed
pabois's avatar
pabois committed
#  university_id            :uuid             not null, indexed
Sébastien Gaya's avatar
Sébastien Gaya committed
#
# Indexes
#
Sébastien Gaya's avatar
Sébastien Gaya committed
#  idx_comm_website_menus_on_communication_website_id  (communication_website_id)
Sébastien Gaya's avatar
Sébastien Gaya committed
#  index_communication_website_menus_on_language_id    (language_id)
#  index_communication_website_menus_on_original_id    (original_id)
Sébastien Gaya's avatar
Sébastien Gaya committed
#  index_communication_website_menus_on_university_id  (university_id)
#
# Foreign Keys
#
Sébastien Gaya's avatar
Sébastien Gaya committed
#  fk_rails_2901ebb799  (original_id => communication_website_menus.id)
#  fk_rails_4d43d36541  (language_id => languages.id)
pabois's avatar
pabois committed
#  fk_rails_8d6227916e  (university_id => universities.id)
#  fk_rails_dcc7198fc5  (communication_website_id => communication_websites.id)
Sébastien Gaya's avatar
Sébastien Gaya committed
#
class Communication::Website::Menu < ApplicationRecord
Arnaud Levy's avatar
Arnaud Levy committed
  include AsDirectObject
pabois's avatar
pabois committed
  include Sanitizable
  include WithAutomatism
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithTranslations
Arnaud Levy's avatar
Arnaud Levy committed
  include WithUniversity
Sébastien Gaya's avatar
Sébastien Gaya committed

Sébastien Gaya's avatar
Sébastien Gaya committed
  has_many :items, class_name: 'Communication::Website::Menu::Item', dependent: :destroy

  validates :title, :identifier, presence: true
Sébastien Gaya's avatar
Sébastien Gaya committed
  validates :identifier, uniqueness: { scope: [:communication_website_id, :language_id] }
Sébastien Gaya's avatar
Sébastien Gaya committed

  scope :ordered, -> { order(created_at: :asc) }

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

  def git_path(website)
Sébastien Gaya's avatar
Sébastien Gaya committed
    "data/menus/#{language.iso_code}/#{identifier}.yml"
Sébastien Gaya's avatar
Sébastien Gaya committed
  end
Arnaud Levy's avatar
Arnaud Levy committed

  def template_static
    "admin/communication/websites/menus/static"
  end
Sébastien Gaya's avatar
Sébastien Gaya committed

  def translate_additional_data!(translation)
    items.root.ordered.each { |item| translate_menu_item!(item, translation) }
  end

  def translate_menu_item!(item, menu_translation, parent_translation = nil)
    item_translation = item.dup
    item_translation.menu = menu_translation
    item_translation.parent = parent_translation

Sébastien Gaya's avatar
cc  
Sébastien Gaya committed
    # TODO : I18n
    # For now, only pages, posts, categories are handled.
    # We need to translate programs, diplomas, volumes and papers
    set_item_translation_attributes(item_translation, item, menu_translation)

    # If no translation and no children to translate, translation won't be save, as about is nil and kind requires one.
    if item_translation.save
      item.children.ordered.each do |child|
        translate_menu_item!(child, menu_translation, item_translation)
Sébastien Gaya's avatar
Sébastien Gaya committed
      end
    end
Sébastien Gaya's avatar
cc  
Sébastien Gaya committed
  end
Sébastien Gaya's avatar
Sébastien Gaya committed

Sébastien Gaya's avatar
cc  
Sébastien Gaya committed
  def set_item_translation_attributes(item_translation, item, menu_translation)
    return unless item.about.present? && item.about.respond_to?(:translation_for)
    # Search for the target translation based on the given language.
    item_translation.about = item.about.translation_for(menu_translation.language)
    # If no target translation found, convert to a blank menu item if item has children.
    item_translation.kind = 'blank' if item_translation.about.nil? && item.children.any?
Sébastien Gaya's avatar
Sébastien Gaya committed
  end
Sébastien Gaya's avatar
Sébastien Gaya committed
end