85 lines
2.1 KiB
Ruby
85 lines
2.1 KiB
Ruby
class Page < ApplicationRecord
|
|
include ActsAsTree
|
|
|
|
belongs_to :user, :foreign_key => 'updated_by'
|
|
|
|
acts_as_versioned version_column: :lock_version
|
|
self.non_versioned_columns += %w(permalink created_at title)
|
|
|
|
acts_as_tree :order => "title"
|
|
|
|
attr_accessor :old_title # Save title to create redirect page when editing title
|
|
|
|
validates_presence_of :title, :body
|
|
validates_uniqueness_of :permalink, :title
|
|
|
|
before_validation :set_permalink, :on => :create
|
|
before_validation :update_permalink, :on => :update
|
|
after_update :create_redirect
|
|
|
|
scope :non_redirected, -> { where(:redirect => nil) }
|
|
scope :no_parent, -> { where(:parent_id => nil) }
|
|
|
|
def self.permalink(title)
|
|
title.gsub(/[\/\.,;@\s]/, "_").gsub(/[\"\']/, "")
|
|
end
|
|
|
|
def homepage?
|
|
permalink == "Home"
|
|
end
|
|
|
|
def self.dashboard
|
|
where(permalink: "Dashboard").first
|
|
end
|
|
|
|
def self.public_front_page
|
|
where(permalink: "Public_frontpage").first
|
|
end
|
|
|
|
def self.welcome_mail
|
|
where(permalink: "Welcome_mail").first
|
|
end
|
|
|
|
def set_permalink
|
|
unless title.blank?
|
|
self.permalink = Page.count == 0 ? "Home" : Page.permalink(title)
|
|
end
|
|
end
|
|
|
|
def diff
|
|
current = versions.latest
|
|
old = versions.where(["page_id = ? and lock_version < ?", current.page_id, current.lock_version]).order('lock_version DESC').first
|
|
|
|
if old
|
|
o = ''
|
|
Diffy::Diff.new(old.body, current.body).each do |line|
|
|
case line
|
|
when /^\+/ then o += "#{line.chomp}<br />" unless line.chomp == "+"
|
|
when /^-/ then o += "#{line.chomp}<br />" unless line.chomp == "-"
|
|
end
|
|
end
|
|
o
|
|
else
|
|
current.body
|
|
end
|
|
end
|
|
|
|
protected
|
|
|
|
def update_permalink
|
|
if changed.include?("title")
|
|
set_permalink
|
|
self.old_title = changes["title"].first # Save title for creating redirect
|
|
end
|
|
end
|
|
|
|
def create_redirect
|
|
unless old_title.blank?
|
|
Page.create :redirect => id,
|
|
:title => old_title,
|
|
:body => I18n.t('model.page.redirect', :title => title),
|
|
:permalink => Page.permalink(old_title),
|
|
:updated_by => updated_by
|
|
end
|
|
end
|
|
end
|