docbrown/app/models/display_ad.rb
Joshua Wehner 4cddc0bc22
DisplayAd in post comments area (#18141)
* WIP: DisplayAd in post comments area

* Tweak css/display

* Allow div/class in DisplayAd markdown
2022-07-25 12:43:02 -04:00

46 lines
1.8 KiB
Ruby

class DisplayAd < ApplicationRecord
resourcify
ALLOWED_PLACEMENT_AREAS = %w[sidebar_left sidebar_left_2 sidebar_right post_comments].freeze
ALLOWED_PLACEMENT_AREAS_HUMAN_READABLE = ["Sidebar Left (First Position)",
"Sidebar Left (Second Position)",
"Sidebar Right",
"Below the comment section"].freeze
belongs_to :organization, optional: true
has_many :display_ad_events, dependent: :destroy
validates :placement_area, presence: true,
inclusion: { in: ALLOWED_PLACEMENT_AREAS }
validates :body_markdown, presence: true
before_save :process_markdown
scope :approved_and_published, -> { where(approved: true, published: true) }
def self.for_display(area)
relation = approved_and_published.where(placement_area: area).order(success_rate: :desc)
if rand(8) == 1
relation.sample
else
relation.limit(rand(1..15)).sample
end
end
def human_readable_placement_area
ALLOWED_PLACEMENT_AREAS_HUMAN_READABLE[ALLOWED_PLACEMENT_AREAS.find_index(placement_area)]
end
private
def process_markdown
renderer = Redcarpet::Render::HTMLRouge.new(hard_wrap: true, filter_html: false)
markdown = Redcarpet::Markdown.new(renderer, Constants::Redcarpet::CONFIG)
initial_html = markdown.render(body_markdown)
stripped_html = ActionController::Base.helpers.sanitize initial_html,
tags: MarkdownProcessor::AllowedTags::DISPLAY_AD,
attributes: MarkdownProcessor::AllowedAttributes::DISPLAY_AD
html = stripped_html.delete("\n")
self.processed_html = Html::Parser.new(html).prefix_all_images(350, synchronous_detail_detection: true).html
end
end