Class: Caboose::Post

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/caboose/post.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

Returns an array of block IDs for all descendant blocks of the homepage footer



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'app/models/caboose/post.rb', line 52

def self.home_page_footer_block_ids(post)
  home_page = Caboose::Page.index_page(post.site_id)
  home_footer = home_page ? home_page.block.child('footer') : nil
  if home_footer
    footer_ids = [home_footer.id]
    home_footer.children.where("name is null").each do |f1|
      footer_ids << f1.id
      f1.children.where("name is null").each do |f2|
        footer_ids << f2.id
        f2.children.where("name is null").each do |f3|
          footer_ids << f3.id
          f3.children.where("name is null").each do |f4|
            footer_ids << f4.id
            f4.children.where("name is null").each do |f5|
              footer_ids << f5.id
            end
          end
        end
      end
    end
    return footer_ids
  else
    return [0]
  end
end

.slug(str) ⇒ Object



43
44
45
# File 'app/models/caboose/post.rb', line 43

def self.slug(str)    
  return str.downcase.gsub(' ', '-').gsub(/[^\w-]/, '')        
end

.uri(post) ⇒ Object



192
193
194
195
196
197
198
199
200
# File 'app/models/caboose/post.rb', line 192

def self.uri(post)
  str = "/posts/#x{post.created_at.strftime('%Y/%m/%d')}/#{post.slug}"
  i = 2
  while Caboose::Post.where("site_id = ? and id <> ? and uri = ?", post.site_id, post.id, str).exists?
    str = "/posts/#{post.created_at.strftime('%Y/%m/%d')}/#{post.slug}-#{i}"
    i = i + 1
  end      
  return str
end

Instance Method Details

#blockObject



35
36
37
# File 'app/models/caboose/post.rb', line 35

def block
  Caboose::Block.where("post_id = ? and parent_id is null", self.id).first
end

#cached_cssObject



87
88
89
90
91
92
93
94
95
96
# File 'app/models/caboose/post.rb', line 87

def cached_css
  str = ''
  return str if self.site.nil? || !self.site.use_caching
  footer_ids = Caboose::Post.home_page_footer_block_ids(self)
  blocks = Caboose::Block.includes(:block_type).where("blocks.post_id = ? OR blocks.parent_id in (?)",self.id,footer_ids).where("blocks.cached_css IS NOT NULL").where("block_types.is_dynamic = false").all
  blocks.each do |b|
    str << b.cached_css
  end
  return str.blank? ? '' : str.gsub(/<\/style>(\s*)<style>/,'')
end

#cached_jsObject



98
99
100
101
102
103
104
105
106
107
# File 'app/models/caboose/post.rb', line 98

def cached_js
  str = ''
  return str if self.site.nil? || !self.site.use_caching
  footer_ids = Caboose::Post.home_page_footer_block_ids(self)
  blocks = Caboose::Block.includes(:block_type).where("blocks.post_id = ? OR blocks.parent_id in (?)",self.id,footer_ids).where("blocks.cached_js IS NOT NULL").where("block_types.is_dynamic = false").all
  blocks.each do |b|
    str << b.cached_js
  end
  return str
end

#custom_field_value(key) ⇒ Object



218
219
220
221
222
223
224
225
226
# File 'app/models/caboose/post.rb', line 218

def custom_field_value(key)
  fv = Caboose::PostCustomFieldValue.where(:post_id => self.id, :key => key).first
  if fv.nil?
    f = Caboose::PostCustomField.where(:site_id => self.site_id, :key => key).first
    return nil if f.nil?
    fv = Caboose::PostCustomFieldValue.create(:post_id => self.id, :post_custom_field_id => f.id, :key => key, :value => f.default_value, :sort_order => f.sort_order)
  end
  return fv.value
end

#is_publishedObject



47
48
49
# File 'app/models/caboose/post.rb', line 47

def is_published
  Caboose::Block.where(:post_id => self.id).where('status != ?','published').count == 0 if !self.id.nil?
end

#publish(user_id) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'app/models/caboose/post.rb', line 109

def publish(user_id)
  if !self.id.nil?
    use_caching = self.site.use_caching
    changed_ids = []
    Caboose::Block.where(:post_id => self.id).where('status = ? OR status = ?','edited','added').all.each do |b|
      if self.site && self.site.use_change_logs
        if b.new_parent_id.blank? && b.new_value.blank? && b.sort_order == b.new_sort_order && b.status == 'edited'
          # This one just got moved because something else was added
        else
          cl = Caboose::ChangeLog.create(:site_id => self.site_id, :user_id => user_id, :post_id => self.id, :block_id => b.id, :block_parent_id => b.parent_id, :timestamp => DateTime.now, :action => b.status)
          desc = ""
          desc += b.parent.parent.block_type.description + " -> " if b.parent && b.parent.parent && b.parent.parent.block_type && b.parent.parent.block_type.description != "Content" && !b.parent.parent.block_type.name.include?('layout')
          pos = b.parent && b.parent.block_type && b.parent.block_type.name == 'flex_grid_unit' ? b.parent.sort_order + 1 : nil
          desc += b.parent.block_type.description + " #{pos} -> " if b.parent && b.parent.block_type && b.parent.block_type.description != "Content" && !b.parent.block_type.name.include?('layout')
          desc += b.block_type.description if b.block_type
          cl.description = desc
          cl.is_field = true if !b.name.blank?
          ov = ['page','page_id'].include?(b.name) ? Caboose::Page.title_for_id(b.value) : b.value
          nv = ['page','page_id'].include?(b.name) ? Caboose::Page.title_for_id(b.new_value) : b.new_value
          if b.new_value.blank? && !b.new_media_id.blank?
            ov = Caboose::Media.title_for_id(b.media_id)
            nv = Caboose::Media.title_for_id(b.new_media_id)
          end
          cl.old_value = ov
          cl.new_value = nv
          cl.old_sort_order = b.sort_order
          cl.new_sort_order = b.new_sort_order
          cl.old_parent_id = b.parent_id
          cl.new_parent_id = b.new_parent_id
          cl.save
        end
      end
      if b.new_value == 'EMPTY'
        b.value = nil
      elsif !b.new_value.blank?
        b.value = b.new_value
      end
      if b.new_media_id == 0
        b.media_id = nil
      elsif !b.new_media_id.blank?
        b.media_id = b.new_media_id
      end
      b.sort_order = b.new_sort_order if !b.new_sort_order.blank?
      b.parent_id = b.new_parent_id if !b.new_parent_id.blank?
      b.status = 'published'
      b.new_value = nil
      b.new_media_id = nil
      b.new_sort_order = b.sort_order
      b.new_parent_id = nil
      b.save
      # Update cached value for the closest cached ancestor of this block
      changed_ids << b.cached_ancestor if use_caching
    end
    if use_caching # Catch published blocks that have never been cached before
      content = self.block.child('content')
      Caboose::Block.includes(:block_type).where(:parent_id => content.id, :status => 'published', :cached_value => nil, :name => nil).where("block_types.is_dynamic = false").all.each do |b|
        changed_ids << b.cached_ancestor
      end
    end
    deleted_blocks = Caboose::Block.where(:post_id => self.id, :status => 'deleted').pluck(:id)
    dids = deleted_blocks.blank? ? 0 : deleted_blocks
    if self.site && self.site.use_change_logs
      Caboose::Block.where("id in (?)",dids).all.each do |b|
        cl = Caboose::ChangeLog.create(:site_id => self.site_id, :user_id => user_id, :post_id => self.id, :block_id => b.id, :block_parent_id => b.parent_id, :timestamp => DateTime.now, :action => 'deleted')
        cl.old_value = b.new_value.blank? ? b.value : b.new_value
        cl.description = b.block_type.description if b.block_type
        cl.is_field = true if !b.name.blank?
        cl.save
      end
    end
    Caboose::Block.where("id in (?) or parent_id in (?)",dids,dids).destroy_all
    Caboose::Block.where(:post_id => self.id, :status => nil).update_all(:status => 'published')
    self.update_cached_blocks(changed_ids) if use_caching
  end
end

#revertObject



185
186
187
188
189
190
# File 'app/models/caboose/post.rb', line 185

def revert
  if !self.id.nil?
    Caboose::Block.where(:post_id => self.id).where(:status => 'added').destroy_all
    Caboose::Block.where(:post_id => self.id).update_all("status = 'published', new_value = null, new_media_id = null, new_sort_order = sort_order, new_parent_id = null")
  end
end

#set_slug_and_uri(str) ⇒ Object



202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
# File 'app/models/caboose/post.rb', line 202

def set_slug_and_uri(str)
  d = self.created_at.strftime('%Y/%m/%d')
  s = Caboose::Post.slug(str)
  new_slug = "#{s}"
  new_uri = "/posts/#{d}/#{new_slug}"
  i = 2
  while Caboose::Post.where("site_id = ? and id <> ? and uri = ?", self.site_id, self.id, new_uri).exists?
    new_slug = "#{s}-#{i}"
    new_uri = "/posts/#{d}/#{new_slug}"      
    i = i + 1
  end
  self.slug = new_slug
  self.uri = new_uri
  self.save        
end

#top_level_blocksObject



39
40
41
# File 'app/models/caboose/post.rb', line 39

def top_level_blocks
  Caboose::Block.where("post_id = ? and parent_id is null", self.id).reorder(:sort_order).all
end

#update_cached_blocks(block_ids) ⇒ Object



78
79
80
81
82
83
84
85
# File 'app/models/caboose/post.rb', line 78

def update_cached_blocks(block_ids)
  blocks = block_ids && block_ids.count > 0 ? Caboose::Block.where("id in (?)", block_ids).order(:id).all : []
  blocks.each do |b|
    b.use_cache = false
    b.save
    b.delay(:queue => 'caching', :priority => 6).update_cache
  end
end

#verify_custom_field_values_existObject



228
229
230
231
232
233
# File 'app/models/caboose/post.rb', line 228

def verify_custom_field_values_exist
  Caboose::PostCustomField.where(:site_id => self.site_id).all.each do |f|
    fv = Caboose::PostCustomFieldValue.where(:post_id => self.id, :post_custom_field_id => f.id).first                  
    Caboose::PostCustomFieldValue.create(:post_id => self.id, :post_custom_field_id => f.id, :key => f.key, :value => f.default_value, :sort_order => f.sort_order) if fv.nil?
  end
end