Skip to content
Snippets Groups Projects
website.rb 4.59 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
# == Schema Information
#
pabois's avatar
pabois committed
# Table name: communication_websites
Arnaud Levy's avatar
Arnaud Levy committed
#
#  id                  :uuid             not null, primary key
#  about_type          :string           indexed => [about_id]
#  access_token        :string
#  git_branch          :string
#  git_endpoint        :string
#  git_provider        :integer          default("github")
#  in_production       :boolean          default(FALSE)
#  name                :string
#  plausible_url       :string
#  repository          :string
#  style               :text
#  style_updated_at    :date
#  theme_version       :string           default("NA")
#  url                 :string
#  created_at          :datetime         not null
#  updated_at          :datetime         not null
#  about_id            :uuid             indexed => [about_type]
#  default_language_id :uuid             not null, indexed
#  university_id       :uuid             not null, indexed
Arnaud Levy's avatar
Arnaud Levy committed
#
# Indexes
#
#  index_communication_websites_on_about                (about_type,about_id)
#  index_communication_websites_on_default_language_id  (default_language_id)
#  index_communication_websites_on_university_id        (university_id)
Arnaud Levy's avatar
Arnaud Levy committed
#
# Foreign Keys
#
#  fk_rails_2b6d929310  (default_language_id => languages.id)
Arnaud Levy's avatar
Arnaud Levy committed
#  fk_rails_bb6a496c08  (university_id => universities.id)
Arnaud Levy's avatar
Arnaud Levy committed
#
Arnaud Levy's avatar
Arnaud Levy committed
class Communication::Website < ApplicationRecord
  self.filter_attributes += [:access_token]
Sébastien Gaya's avatar
Sébastien Gaya committed

Arnaud Levy's avatar
Arnaud Levy committed
  include WithUniversity
pabois's avatar
pabois committed
  include WithAbouts
pabois's avatar
pabois committed
  include WithConfigs
pabois's avatar
pabois committed
  include WithDependencies
Arnaud Levy's avatar
Arnaud Levy committed
  include WithGit
pabois's avatar
pabois committed
  include WithGitRepository
Arnaud Levy's avatar
Arnaud Levy committed
  include WithImport
pabois's avatar
pabois committed
  include WithProgramCategories
pabois's avatar
pabois committed
  include WithSpecialPages
Arnaud Levy's avatar
Arnaud Levy committed
  include WithMenus # Menus must be created after special pages, so we can fill legal menu
  include WithStyle
Arnaud Levy's avatar
Arnaud Levy committed
  include WithTheme
Arnaud Levy's avatar
Arnaud Levy committed

pabois's avatar
pabois committed
  enum git_provider: {
    github: 0,
    gitlab: 1
  }

  belongs_to :default_language, class_name: "Language"
pabois's avatar
pabois committed
  has_and_belongs_to_many :languages,
                          class_name: 'Language',
                          join_table: 'communication_websites_languages',
                          foreign_key: 'communication_website_id',
                          association_foreign_key: 'language_id'

  validates :languages, length: { minimum: 1 }
  validate :languages_must_include_default_language
pabois's avatar
pabois committed
  scope :ordered, -> { order(:name) }
  scope :in_production, -> { where(in_production: true) }
  scope :for_theme_version, -> (version) { where(theme_version: version) }
pabois's avatar
pabois committed
  scope :for_search_term, -> (term) {
    where("
      unaccent(communication_websites.name) ILIKE unaccent(:term) OR
      unaccent(communication_websites.url) ILIKE unaccent(:term)
    ", term: "%#{sanitize_sql_like(term)}%")
Sébastien Gaya's avatar
Sébastien Gaya committed
  def to_s
    "#{name}"
  end

  def git_path(website)
Arnaud Levy's avatar
Arnaud Levy committed
    "data/website.yml"
pabois's avatar
pabois committed
  end
pabois's avatar
pabois committed

  def git_dependencies(website)
Arnaud Levy's avatar
Arnaud Levy committed
    dependencies = [
      self,
      config_default_languages,
      config_default_permalinks,
      config_development_config,
Arnaud Levy's avatar
Arnaud Levy committed
      config_production_config
    ] + menus
    dependencies += pages + pages.includes(parent: { featured_image_attachment: :blob }, featured_image_attachment: :blob).map(&:active_storage_blobs).flatten + pages.map(&:git_block_dependencies).flatten
    dependencies += posts + posts.includes(featured_image_attachment: :blob).map(&:active_storage_blobs).flatten + posts.map(&:git_block_dependencies).flatten
    dependencies += people_with_facets + people.map(&:active_storage_blobs).flatten + people.map(&:git_block_dependencies).flatten
    dependencies += organizations_in_blocks + organizations_in_blocks.map(&:active_storage_blobs).flatten + organizations_in_blocks.map(&:git_block_dependencies).flatten
    dependencies += categories + categories.map(&:git_block_dependencies).flatten
    dependencies += about.git_dependencies(website) if about.present?
    dependencies
  end
  def best_language_for(iso_code)
    # We look for the language by the ISO code in the websites languages.
    # If not found, we fallback to the default language.
    languages.find_by(iso_code: iso_code) || default_language
  end

  def sanitize_fields
    self.git_branch = Osuny::Sanitizer.sanitize(self.git_branch, 'string')
    self.git_endpoint = Osuny::Sanitizer.sanitize(self.git_endpoint, 'string')
    self.name = Osuny::Sanitizer.sanitize(self.name, 'string')
    self.plausible_url = Osuny::Sanitizer.sanitize(self.plausible_url, 'string')
    self.repository = Osuny::Sanitizer.sanitize(self.repository, 'string')
    self.url = Osuny::Sanitizer.sanitize(self.url, 'string')
  end

  def languages_must_include_default_language
    errors.add(:languages, :must_include_default) unless language_ids.include?(default_language_id)
  end
Arnaud Levy's avatar
Arnaud Levy committed
end