require 'json'
module Polyblock
class Block < ActiveRecord::Base
attr_accessor :settings_cache
DEFAULTS = {
:association => {
:class_name => "Polyblock::Block",
:as => :contentable,
:dependent => :destroy
},
:nested_attributes => {},
:validates => {},
:html => true,
:default_text => "[Editable content space for Polyblock #{name}
]"
}
belongs_to :contentable, :polymorphic => true
before_save :strip_html_if_necessary
def self.import(pbs)
outputs = pbs.map do |pb|
block = fetch_or_initialize pb['name']
block.content = pb['content'] if pb.key?('content') && pb['content'].present? && pb['content'] != block.content
block.save
end
outputs.include?(false)
end
def self.export
output = all.as_json(:except => [:id, :created_at, :updated_at])
puts ""
puts "Run the following in Rails Console on the remote server:"
puts ""
puts "Polyblock::Block.import(#{output})"
puts ""
end
def settings
return self.settings_cache unless self.settings_cache.nil?
self.settings_cache = self.contentable.present? ? self.contentable.send("#{self.name}_settings") : DEFAULTS
end
def to_s
return nil if self.content.nil?
self.class.strip_html(self.content) end
def present?
!nil? && content.present?
end
def blank?
nil? || content.blank?
end
def system?
self.contentable.nil?
end
def self.fetch_or_initialize(name)
if name.is_a?(Block) then name
else
name = name.to_s if name.is_a? Symbol
unless name.is_a? String
raise 'Invalid name passed to Polyblock::Block#fetch_or_initialize'
end
matches = find_by(name: name)
return matches if matches.present?
new({name: name})
end
end
def self.fetch_or_create(name)
pb = fetch_or_initialize(name)
pb.save if pb.new_record?
pb
end
def self.next_id
any? ? maximum(:id).next : 1
end
def self.random_id
o = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten
(0...50).map { o[rand(o.length)] }.join
end
def self.strip_html(str)
return str unless str.present?
output = str.gsub('
', '
').gsub(' ', ' ')
output = CGI.unescapeHTML(output)
output = ActionController::Base.helpers.strip_tags(output)
output.html_safe
end
private
def strip_html_if_necessary
self.content = Block.strip_html(self.content) unless self.settings[:html] || self.content.nil?
end
end
end