Newer
Older
# == Schema Information
#
# Table name: communication_website_posts
#
# id :uuid not null, primary key
# description :text
# title :string
# created_at :datetime not null
# updated_at :datetime not null
# author_id :uuid indexed
# communication_website_id :uuid not null, indexed
# index_communication_website_posts_on_author_id (author_id)
# index_communication_website_posts_on_communication_website_id (communication_website_id)
# index_communication_website_posts_on_language_id (language_id)
# index_communication_website_posts_on_university_id (university_id)
#
# Foreign Keys
#
# fk_rails_1e0d058a25 (university_id => universities.id)
# fk_rails_d1c1a10946 (communication_website_id => communication_websites.id)
# fk_rails_e0eec447b0 (author_id => university_people.id)
include WithFeaturedImage
include WithBlobs
has_one :imported_post,
class_name: 'Communication::Website::Imported::Post',
dependent: :destroy
has_and_belongs_to_many :categories,
class_name: 'Communication::Website::Category',
join_table: 'communication_website_categories_posts',
foreign_key: 'communication_website_post_id',
association_foreign_key: 'communication_website_category_id'
before_validation :set_published_at, if: :published_changed?
after_save_commit :update_authors_statuses!, if: :saved_change_to_author_id?
scope :published, -> {
where("
communication_website_posts.published = true AND
DATE(communication_website_posts.published_at) <= now()
")
}
scope :published_in_the_future, -> {
where("
communication_website_posts.published = true AND
DATE(communication_website_posts.published_at) > now()
")
}
scope :ordered, -> { order(published_at: :desc, created_at: :desc) }
scope :recent, -> { order(published_at: :desc).limit(5) }
scope :for_category, -> (category_id) { joins(:categories).where(communication_website_categories: { id: category_id }).distinct }
scope :for_pinned, -> (pinned) { where(pinned: pinned == 'true') }
scope :for_search_term, -> (term) {
where("
unaccent(communication_website_posts.description) ILIKE unaccent(:term) OR
unaccent(communication_website_posts.description_short) ILIKE unaccent(:term) OR
unaccent(communication_website_posts.text) ILIKE unaccent(:term) OR
unaccent(communication_website_posts.title) ILIKE unaccent(:term)
", term: "%#{sanitize_sql_like(term)}%")
}
"#{git_path_content_prefix(website)}posts/#{static_path}.html" if website.id == communication_website_id && published && published_at
"#{published_at.year}/#{published_at.strftime "%Y-%m-%d"}-#{slug}"
def template_static
"admin/communication/websites/posts/static"
end
dependencies += categories
dependencies += active_storage_blobs
dependencies += university.communication_blocks.where(template_kind: :posts).includes(:about).map(&:about).uniq
if author.present?
dependencies += [author, author.author]
dependencies += author.active_storage_blobs
end
dependencies
[self] + explicit_active_storage_blobs
def url
return unless published
return if website.url.blank?
return if current_permalink_in_website(website).blank?
Static.clean_path "#{website.url}#{current_permalink_in_website(website).path}"
protected
def slug_unavailable?(slug)
self.class.unscoped
.where(communication_website_id: self.communication_website_id, slug: slug)
.where.not(id: self.id)
.exists?
self.published_at = Time.zone.now if published && published_at.nil?
end
def inherited_blob_ids
[best_featured_image&.blob_id]
end
def update_authors_statuses!
old_author = University::Person.find_by(id: author_id_before_last_save)
if old_author && old_author.communication_website_posts.none?
old_author.update_and_sync(is_author: false)
end
author.update_and_sync(is_author: true) if author_id
end