Skip to content
Snippets Groups Projects
extranet.rb 4.04 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
# == Schema Information
#
# Table name: communication_extranets
#
Sébastien Gaya's avatar
Sébastien Gaya committed
#  id                         :uuid             not null, primary key
#  about_type                 :string           indexed => [about_id]
#  color                      :string
#  css                        :text
#  feature_alumni             :boolean          default(FALSE)
#  feature_contacts           :boolean          default(FALSE)
#  feature_documents          :boolean          default(FALSE)
Sébastien Gaya's avatar
Sébastien Gaya committed
#  feature_jobs               :boolean          default(FALSE)
#  feature_posts              :boolean          default(FALSE)
#  has_sso                    :boolean          default(FALSE)
#  host                       :string
#  sass                       :text
#  sso_cert                   :text
#  sso_mapping                :jsonb
#  sso_name_identifier_format :string
#  sso_provider               :integer          default("saml")
#  sso_target_url             :string
#  created_at                 :datetime         not null
#  updated_at                 :datetime         not null
#  about_id                   :uuid             indexed => [about_type]
#  university_id              :uuid             not null, indexed
Arnaud Levy's avatar
Arnaud Levy committed
#
# Indexes
#
pabois's avatar
pabois committed
#  index_communication_extranets_on_about          (about_type,about_id)
Arnaud Levy's avatar
Arnaud Levy committed
#  index_communication_extranets_on_university_id  (university_id)
#
# Foreign Keys
#
#  fk_rails_c2268c7ebd  (university_id => universities.id)
#
class Communication::Extranet < ApplicationRecord
Sébastien Gaya's avatar
Sébastien Gaya committed
  self.filter_attributes += [:sso_cert]

  # We don't include Sanitizable because too many complex attributes. We handle it below.
Sébastien Gaya's avatar
Sébastien Gaya committed
  include Favoritable
  include Filterable
  include Localizable
  include LocalizableOrderByNameScope
pabois's avatar
pabois committed
  include WithAbouts
Arnaud Levy's avatar
Arnaud Levy committed
  include WithConnectedObjects
Arnaud Levy's avatar
Arnaud Levy committed
  include WithFeatures
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithLegal
pabois's avatar
pabois committed
  include WithSso
Arnaud Levy's avatar
Arnaud Levy committed
  include WithStyle
Arnaud Levy's avatar
Arnaud Levy committed
  include WithUniversity
Arnaud Levy's avatar
Arnaud Levy committed

  has_many :languages, through: :localizations
Arnaud Levy's avatar
Arnaud Levy committed
  has_many :posts
  has_many :post_localizations, class_name: 'Communication::Extranet::Post::Localization'
Arnaud Levy's avatar
Arnaud Levy committed
  has_many :post_categories, class_name: 'Communication::Extranet::Post::Category'
  has_many :post_category_localizations, class_name: 'Communication::Extranet::Post::Category::Localization'
Arnaud Levy's avatar
Arnaud Levy committed
  has_many :documents
Arnaud Levy's avatar
Arnaud Levy committed
  has_many :document_categories, class_name: 'Communication::Extranet::Document::Category'
  has_many :document_kinds, class_name: 'Communication::Extranet::Document::Kind'
  validates :host, presence: true
  validates :about_type, :about_id, presence: true, if: :feature_alumni
  scope :for_search_term, -> (term, language) {
    joins(:localizations)
    .where("
      unaccent(communication_extranets.host) ILIKE unaccent(:term) OR
      unaccent(communication_extranet_localizations.name) ILIKE unaccent(:term)
pabois's avatar
pabois committed
    ", term: "%#{sanitize_sql_like(term)}%")
  }

Arnaud Levy's avatar
Arnaud Levy committed
  def self.with_host(host)
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def should_show_years?
Arnaud Levy's avatar
Arnaud Levy committed
    # For a single program, year is like cohort
pabois's avatar
pabois committed
    return false if about.nil? || about&.is_a?(Education::Program)
Arnaud Levy's avatar
Arnaud Levy committed
    # if a school has a single program, same thing
pabois's avatar
pabois committed
    about&.programs&.many?
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def alumni
    about&.university_person_alumni
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def users
Sébastien Gaya's avatar
Sébastien Gaya committed
    if feature_alumni?
      university.users.where(person: alumni)
    elsif feature_contacts?
      university.users.where(person: connected_people)
    else
      university.users.none
    end
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def cohorts
    about&.cohorts
  end

  def years
    about&.academic_years
  end
  alias :academic_years :years
Arnaud Levy's avatar
Arnaud Levy committed

  def organizations
Sébastien Gaya's avatar
Sébastien Gaya committed
    if about.present? && about.respond_to?(:alumni_organizations)
      about.alumni_organizations
    else
      connected_organizations
    end
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def experiences
Sébastien Gaya's avatar
Sébastien Gaya committed
    if about.present? && about.respond_to?(:alumni_experiences)
      about.alumni_experiences
    else
      experiences_through_connections
    end
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def url
    @url ||= Rails.env.development? ? "http://#{host}:3000" : "https://#{host}"
Arnaud Levy's avatar
Arnaud Levy committed
  end


  def sanitize_fields
    self.color = Osuny::Sanitizer.sanitize(self.color, 'string')
    self.host = Osuny::Sanitizer.sanitize(self.host, 'string')
  end
Arnaud Levy's avatar
Arnaud Levy committed
end