Class: Page

Inherits:
KitIndexed show all
Defined in:
app/models/page.rb

Direct Known Subclasses

BlogPost, StaticPage

Constant Summary collapse

@@index_def =
[
{:name=>:id, :index=>:not_analyzed, :include_in_all=>false},
{:name=>:system_id, :index=>:not_analyzed, :include_in_all=>false},
{:name=>:name, :boost=>100, :user=>true},
{:name=>:title, :boost=>50, :user=>true},
{:name=>:tags, :boost=>20},
{:name=>:full_path, :boost=>50},
{:name=>:meta_description, :boost=>20, :user=>true},
{:name=>:meta_keywords, :boost=>20, :user=>true},
{:name=>:notes},
{:name=>:terms, :as=>"concatenated_terms", :user=>true},
{:name=>:created_by, :as=>"user.email"},
{:name=>:updated_at, :type=>'date', :include_in_all=>false},
{:name=>:status, :as=>"status.name", :index=>:not_analyzed},
{:name=>:is_deleted, :index=>:not_analyzed},
{:name=>:content, :as=>"concatenated_content(:current)", :user=>true},
{:name=>:old_content, :as=>"concatenated_content(:old)", :include_in_all=>false},
{:name=>:draft_content, :as=>"concatenated_content(:draft)", :include_in_all=>false},
{:name=>:autosave_content, :as=>"concatenated_content(:autosave)", :include_in_all=>false}
]
@@per_page =
10

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from KitIndexed

do_indexing, indexed_columns, paginate

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(meth, *args, &block) ⇒ Object



471
472
473
474
475
476
477
478
479
# File 'app/models/page.rb', line 471

def method_missing(meth, *args, &block)
  if meth.to_s =~ /^content_(.+)$/
    load_field($1, *args)
  elsif meth.to_s =~ /^value_(.+)$/
    load_field($1, *args).value
  else
    super
  end
end

Instance Attribute Details

#copy_ofObject

Returns the value of attribute copy_of.



131
132
133
# File 'app/models/page.rb', line 131

def copy_of
  @copy_of
end

#draftObject

Returns the value of attribute draft.



132
133
134
# File 'app/models/page.rb', line 132

def draft
  @draft
end

#editableObject



127
128
129
# File 'app/models/page.rb', line 127

def editable
  @editable || false
end

#pageObject

Returns the value of attribute page.



144
145
146
# File 'app/models/page.rb', line 144

def page
  @page
end

#skip_historyObject

Returns the value of attribute skip_history.



133
134
135
# File 'app/models/page.rb', line 133

def skip_history
  @skip_history
end

Class Method Details

.children_of(category) ⇒ Object



376
377
378
# File 'app/models/page.rb', line 376

def self.children_of(category)
  Page.where(:category_id=>category.id).all
end

.field_matches(sid, field_name, field_value, page_template_ids = nil, only_published_and_visible = true, version = 0) ⇒ Object



460
461
462
463
464
465
466
467
468
469
# File 'app/models/page.rb', line 460

def Page.field_matches(sid, field_name, field_value,  page_template_ids = nil, only_published_and_visible = true, version = 0) 
  ps = Page
  ps = ps.where("pages.page_template_id in (#{page_template_ids.join ','})") if page_template_ids
  ps = ps.where("pages.is_deleted = 0 and pages.status_id = #{Page.published_status(sid).id}") if only_published_and_visible
  ps = ps.joins(:page_contents).where("page_contents.version = #{version}")
  ps = ps.where("page_contents.field_name = '#{field_name}'")
  pc_table = PageContent.arel_table
  ps = ps.where(pc_table[:value].eq(field_value))
  ps.all
end

.field_values(sid, field_name, page_template_ids = nil, only_published_and_visible = true, version = 0) ⇒ Object



453
454
455
456
457
458
# File 'app/models/page.rb', line 453

def Page.field_values(sid, field_name,  page_template_ids = nil, only_published_and_visible = true, version = 0) 
  pcs = PageContent.where(:field_name=>field_name).where(:version=>version)
  pcs = pcs.joins(:page).where("pages.page_template_id in (#{page_template_ids.join ','})") if page_template_ids
  pcs = pcs.joins(:page).where("pages.is_deleted = 0 and pages.status_id = #{Page.published_status(sid).id}") if only_published_and_visible
  pcs.all.map { |pc| pc.value }
end

.index_defObject



28
29
30
# File 'app/models/page.rb', line 28

def self.index_def
  @@index_def
end

.mercury_region(field_type) ⇒ Object



354
355
356
357
358
359
360
361
362
# File 'app/models/page.rb', line 354

def self.mercury_region(field_type)
  if field_type=='text'
    return 'editable'
  elsif field_type=='line'
    return 'editable'
  else
    return 'editable'
  end
end

.published_status(sid) ⇒ Object



87
88
89
# File 'app/models/page.rb', line 87

def self.published_status(sid)
  Status.published_status(sid)
end

.update_all_paths(sid) ⇒ Object



208
209
210
211
212
213
# File 'app/models/page.rb', line 208

def Page.update_all_paths(sid)
  Page.sys(sid).find_each do |p|
    p.skip_history = true
    p.save!
  end
end

Instance Method Details

#add_term(page_term, value) ⇒ Object



550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
# File 'app/models/page.rb', line 550

def add_term(page_term, value)
  new_terms = []

  return new_terms if value == nil

  if value.instance_of?(String)
    new_terms << save_term(page_term, value) if value.not_blank?
  elsif value.instance_of?(HashWithIndifferentAccess)
    value.each do |name, val|
      new_terms << save_term(page_term, val) if val.not_blank?
    end  
  end

  return new_terms
end

#autosave_contentObject



65
66
67
# File 'app/models/page.rb', line 65

def autosave_content
  self.page_contents.where(:version=>-2)
end

#autotitleObject



388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
# File 'app/models/page.rb', line 388

def autotitle
  i = 1
  ok = false
  existing = Page.sys(self.system_id).where(:category_id => self.category_id).all
  until ok
    found = false
    existing.each do |p|
      if p.title == "Page #{i}"
        found = true
        break
      end
    end
    if found==false
      ok = true
    else
      i += 1
    end  
  end
  self.title = "Page #{i}"
end

#by_idObject



227
228
229
230
# File 'app/models/page.rb', line 227

def by_id
  self.page = Page.find_sys_id(self.system_id, self.id)
  return self.page
end

#change_full_pathObject



223
224
225
# File 'app/models/page.rb', line 223

def change_full_path
  self.full_path = make_full_path
end

#clear_auto_saveObject



215
216
217
# File 'app/models/page.rb', line 215

def clear_auto_save
  ActiveRecord::Base.connection.execute("delete from page_contents where version = -2 and page_id = #{self.id}")
end

#clear_cacheObject



181
182
183
# File 'app/models/page.rb', line 181

def clear_cache
  Category.clear_cache(self.system_id)
end

#concatenated_content(type = :current) ⇒ Object



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

def concatenated_content(type = :current)
  method = type.to_s+"_content"
  if self.respond_to?(method)
    contents = self.send(method)
    contents.map {|c| c.value}.join(" ")
  else
    ""
  end
end

#concatenated_termsObject



49
50
51
# File 'app/models/page.rb', line 49

def concatenated_terms
  self.terms.map { |term| term.value ? term.value.downcase : "" }.join(',')
end

#copy_content_from(page) ⇒ Object



505
506
507
508
509
510
511
512
# File 'app/models/page.rb', line 505

def copy_content_from(page) 
  page.page_contents.each do |pc|
    self.page_contents << pc.dup
  end
  page.block_instances.each do |ps|
    self.block_instances << ps.dup
  end
end

#copy_to(cat) ⇒ Object



514
515
516
517
518
519
520
521
522
523
524
# File 'app/models/page.rb', line 514

def copy_to(cat)
  page = self.dup
  page.category = cat
  page.change_full_path
  if page.save
    page.copy_content_from(self)
    return page.id
  else
    return nil
  end
end

#current_contentObject



73
74
75
# File 'app/models/page.rb', line 73

def current_content
  self.page_contents.where(:version=>0)
end

#deleted?Boolean

Returns:

  • (Boolean)


372
373
374
# File 'app/models/page.rb', line 372

def deleted?
  self.is_deleted == 1
end

#destroy_draft(user_id) ⇒ Object



252
253
254
255
256
257
258
259
260
# File 'app/models/page.rb', line 252

def destroy_draft(user_id)
  self.page_contents.where(:version=>-1).each do |c|
    c.destroy
  end
  self.block_instances.where(:version=>-1).each do |bi|
    bi.destroy
  end
  PageHistory.record(self, user_id, 'Draft deleted', "")
end

#dif_template(is_mobile) ⇒ Object



232
233
234
235
236
237
238
# File 'app/models/page.rb', line 232

def dif_template(is_mobile)
  if is_mobile && self.mobile_dif==1
    self.mobile_page_template
  else
    return self.page_template
  end
end

#draft_contentObject



69
70
71
# File 'app/models/page.rb', line 69

def draft_content
  self.page_contents.where(:version=>-1)
end

#generate_block_instance(block_instance_id, block_id, param_options, user_id) ⇒ Object



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
# File 'app/models/page.rb', line 153

def generate_block_instance(block_instance_id, block_id, param_options, user_id)
  if block_id.is_number?
    block = Block.find_sys_id(self.system_id, block_id)
  else

    block = Block.sys(self.system_id).where(:name=>block_id).first
  end

  if param_options == nil
    options = {}
  elsif param_options.instance_of?(String)
    options = eval(param_options)
  else
    options = param_options
  end

  bi = nil
  if options.size>0
    options.each do |name,value|
      bi = BlockInstance.create(:system_id=>self.system_id, :page_id=>self.id, :block_id=>block.id, :field_name=>name, :field_value=>value, :user_id=>user_id, :instance_id=>block_instance_id)
    end
  else
      bi = BlockInstance.create(:system_id=>self.system_id, :page_id=>self.id, :block_id=>block.id, :field_name=>'no_params', :field_value=>'no_params', :user_id=>user_id, :instance_id=>block_instance_id)
  end

  return bi
end

#generate_block_instances(user_id) ⇒ Object



146
147
148
149
150
151
# File 'app/models/page.rb', line 146

def generate_block_instances(user_id)
  # find any instances of:  = kit_editable_block(id, blah blah)
  self.page_template.body.scan(/= ?kit_editable_block\(\'?\"?([^\,\)\'\"]+)\'?\"?\s*,\s*\'?\"?([^\,\)\'\"]+)\'?\"?(?:\s*,\s*(\{.*\}))?\)/) do 
    self.generate_block_instance($1, $2, $3, user_id)
  end
end

#get_block_instances(instance_id, version = 0, field_name = nil, block_id = nil) ⇒ Object

this allows you to get block instances from the page. these block instances might have been eagrly loaded already (which they are in the most common case - i.e. rendering a page using the PageController). If they weren’t loaded they will be when this is called, as they also will if you want something other than version 0



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'app/models/page.rb', line 33

def get_block_instances(instance_id, version = 0, field_name = nil, block_id = nil)
  if version==0
    r = []
    self.block_instances0.each do |block_instance|
      if field_name || block_id
        r << block_instance if block_instance.instance_id == instance_id && block_instance.field_name == field_name && block_instance.block_id == block_id
      else
        r << block_instance if block_instance.instance_id == instance_id
      end
    end
    return r
  else
    self.block_instances.where(:instance_id=>instance_id, :version=>version)
  end
end

#has_draft?Boolean

Returns:

  • (Boolean)


409
410
411
# File 'app/models/page.rb', line 409

def has_draft?
  self.page_contents.where("version < 0").count > 0
end

#has_term_for(page_template_term) ⇒ Object



526
527
528
# File 'app/models/page.rb', line 526

def has_term_for(page_template_term)
  self.terms.where(:page_template_term_id=>page_template_term.id).count > 0
end

#history_endObject



326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
# File 'app/models/page.rb', line 326

def history_end
  return if self.skip_history

  if @new
    PageHistory.record(self, self.created_by, nil, 'New', 'Initial Creation', false)
    return
  end

  if @changes[:status_id] 
    old_status_name = Status.find(@old_status_id).name
    PageHistory.record(self, self.updated_by, 'Status changed', "From: #{old_status_name} To: #{self.status(true).name}")  
  end

  if @changes[:is_deleted]
    PageHistory.record(self, self.updated_by, 'Deleted status change', "Page is now #{self.is_deleted? ? 'deleted' : 'not deleted'}")
  end

  fields = [ ['name','Name'], ['full_path','Path'], ['tags','Tags'], ['meta_description', 'Meta Description'], ['meta_keywords', 'Meta Keywords'] ]

  fields.each do |field|
    if @changes[field[0].to_sym]
      from = @changes[field[1].to_sym][0] rescue ""

      PageHistory.record(self, nil, "#{field[1].to_sym} changed", "From: #{from}")
    end
  end
end

#history_startObject



307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
# File 'app/models/page.rb', line 307

def history_start
  return if self.skip_history

  @new = self.new_record?
  @old_status_id = self.status_id_was
  @changes = self.changes
  @changed = self.changed
  if self.changed.include?("status_id")
    if self.status_id == Page.published_status(self.system_id)
      PageHistory.record(self, user_id, 'Published', "")
      self.published_at = Time.now
    elsif @old_status_id == Page.published_status(self.system_id)
      self.published_at = nil
      PageHistory.record(self, user_id, 'Unpublished', "")
    end
  end

end

#is_favourite?(user) ⇒ Boolean

Returns:

  • (Boolean)


299
300
301
# File 'app/models/page.rb', line 299

def is_favourite?(user)
  user.is_favourite_page?(self)
end

#is_home_page?Boolean

Returns:

  • (Boolean)


198
199
200
# File 'app/models/page.rb', line 198

def is_home_page?
  self.id.to_i == Preference.get(self.system_id, 'home_page').to_i rescue false
end

#is_published?Boolean

Returns:

  • (Boolean)


368
369
370
# File 'app/models/page.rb', line 368

def is_published?
  self.status_id == Status.published_status(self.system_id).id
end

#is_readable_anon?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'app/models/page.rb', line 57

def is_readable_anon?
  self.category.is_readable_anon?
end

#is_stub?Boolean

Returns:

  • (Boolean)


364
365
366
# File 'app/models/page.rb', line 364

def is_stub?
  self.status_id == Status.stub_status(self.system_id).id
end


291
292
293
294
295
296
297
# File 'app/models/page.rb', line 291

def link(mode='show', inplace_edit=false)
  if mode=='show'
    return self.full_path + (inplace_edit ? "?edit=1" : "")
  else
    return "/page/#{self.id}/#{mode}"
  end
end

#load_field(field_name, version = 0) ⇒ Object



481
482
483
484
485
486
487
# File 'app/models/page.rb', line 481

def load_field(field_name, version=0)
  if version==0 #&& self.page_contents.loaded?
    self.page_content_version0(field_name) rescue nil
  else
    PageContent.where(:page_id=>self.id).where("version = #{version}").where("field_name = '#{field_name}'").first rescue nil
  end
end

#make_draft(user_id) ⇒ Object



262
263
264
265
266
267
268
269
270
271
# File 'app/models/page.rb', line 262

def make_draft(user_id)
  self.page_contents.where("version=0").each do |content|
    PageContent.create(:system_id=>self.system_id, :page_id=>self.id, :field_name=>content.field_name,  :version=>-1, :value=>content.value, :user_id=>user_id)
  end

  BlockInstance.sys(self.system_id).where(:page_id=>self.id).where(:version=>0).each do |bi|
    BlockInstance.create(:system_id=>self.system_id, :page_id=>self.id, :field_name=>bi.field_name, :field_value=>bi.field_value, :version=>-1, :user_id=>user_id, :block_id=>bi.block_id, :instance_id=>bi.instance_id)
  end
  PageHistory.record(self, user_id, 'Draft created', "")
end

#make_full_pathObject



380
381
382
383
384
385
386
# File 'app/models/page.rb', line 380

def make_full_path
  if self.category.parent_id == 0
    "/" + self.name
  else
    self.category.path + "/" + self.name
  end
end

#make_home_page!Object



202
203
204
205
206
# File 'app/models/page.rb', line 202

def make_home_page!
  PageHistory.record(self, nil, 'Made to be the home page', "")

  Preference.set(self.system_id, 'home_page', self.id, nil)
end


493
494
495
# File 'app/models/page.rb', line 493

def menu_items
  MenuItem.sys(self.system_id).where(:link_url=>self.full_path).includes(:menu).joins(:menu).order("menus.name, menu_items.order_by")
end

#mobile_page_templateObject



240
241
242
# File 'app/models/page.rb', line 240

def mobile_page_template
  PageTemplate.where(:id=>self.page_template.mobile_version_id).first || self.page_template
end

#name_from_titleObject



194
195
196
# File 'app/models/page.rb', line 194

def name_from_title
  self.title.urlise
end

#old_contentObject



61
62
63
# File 'app/models/page.rb', line 61

def old_content
  self.page_contents.where("version > 0")
end

#page_content_version0(field_name) ⇒ Object



497
498
499
500
501
502
503
# File 'app/models/page.rb', line 497

def page_content_version0(field_name)
  self.page_contents_version0.each do |pc|
    return pc if pc.field_name == field_name
  end

  return nil
end

#page_nameObject



53
54
55
# File 'app/models/page.rb', line 53

def page_name
  (Preference.getCached(self.system_id, 'app_name') + self.full_path).gsub('/','_')
end

#path_must_be_uniqueObject



185
186
187
188
189
190
191
192
# File 'app/models/page.rb', line 185

def path_must_be_unique
  full_path = make_full_path

  cnt = Page.sys(self.system_id).where(:full_path=>full_path).where(["id<>?", self.new_record? ? -1 : self.id]).count
  if cnt > 0
    errors.add(:name, "not unique within this category")
  end
end

#publish(user_id) ⇒ Object



244
245
246
247
248
249
250
# File 'app/models/page.rb', line 244

def publish(user_id)
  self.status_id = Page.published_status(self.system_id).id
  self.publish_draft(user_id) if self.draft
  self.published_at = Time.now
  self.save
  PageHistory.record(self, user_id, 'Published', "")
end

#publish_draft(user_id) ⇒ Object



273
274
275
276
277
278
279
280
281
282
283
# File 'app/models/page.rb', line 273

def publish_draft(user_id)
  self.page_contents.where("version <> -2").order("id desc").each do |pc|
    pc.version += 1
    pc.save
  end
  self.block_instances.where("version <> -2").order("id desc").each do |bi|
    bi.version += 1
    bi.save
  end
  PageHistory.record(self, user_id, 'Draft Published', "")
end

#recent_threads(count, user) ⇒ Object



285
286
287
288
289
# File 'app/models/page.rb', line 285

def recent_threads(count, user)
  level = user ? user.forum_level : 0

  self.topic_threads.limit(count).order("topic_threads.id desc").includes(:topic).where("topic_threads.is_visible = 1 and topics.is_visible = 1 and topics.read_access_level <= #{level}")
end


489
490
491
# File 'app/models/page.rb', line 489

def related_threads(count,user)
  self.recent_threads(count,user)
end

#render_field(name, version = 0) ⇒ Object



413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
# File 'app/models/page.rb', line 413

def render_field(name, version=0)
  value = load_field(name, version).value rescue nil

  return nil unless value
  begin
    value.gsub(/>\[(snippet|block)_([0-9]+)\/([0-9]+)\]</) do |snip|
      block_instance = self.get_block_instances("#{$1}_#{$2}").first
      block_instance.page = self
      r = block_instance ? block_instance.render : "[block missing '#{name}']"
      ">" + r + "<"
    end
  rescue Exception => e
    "[block error: #{e.message}]"
  end
end

#save_term(page_term, value) ⇒ Object



566
567
568
569
570
571
572
573
574
575
# File 'app/models/page.rb', line 566

def save_term(page_term, value)
  new_term = Term.new
  new_term.page_template_term_id = page_term.id
  new_term.value = value
  new_term.metric = 0
  new_term.page_id = self.id
  new_term.system_id = self.system_id
  new_term.save
  return new_term
end

#set_page_template_defaultsObject



542
543
544
545
546
547
548
# File 'app/models/page.rb', line 542

def set_page_template_defaults
  self.skip_history = true
  self.allow_anonymous_comments = self.page_template.allow_anonymous_comments
  self.allow_user_comments = self.page_template.allow_user_comments
  self.save
  self.skip_history = false
end

#stop_edit(user_id) ⇒ Object



219
220
221
# File 'app/models/page.rb', line 219

def stop_edit(user_id)
  PageEdit.delete_all(["page_id = ? and user_id = ?", self.id, user_id]) 
end

#term(term_name) ⇒ Object



530
531
532
# File 'app/models/page.rb', line 530

def term(term_name)
  Term.find_by_sql(["select t.* from terms t, pages p, page_template_terms pt where p.id = #{self.id} and p.page_template_id = pt.page_template_id and pt.name = ? and t.page_template_term_id = pt.id and t.page_id = p.id", term_name])       
end

#term_hierarchy(term_name) ⇒ Object



534
535
536
537
538
539
# File 'app/models/page.rb', line 534

def term_hierarchy(term_name)
  values = term(term_name)
  values.collect { |v|
    v.value.split(':') 
  }
end

#time_nowObject



303
304
305
# File 'app/models/page.rb', line 303

def time_now
  Time.now
end

#update_field(field_name, value, user = nil, field_title = nil, version = 0) ⇒ Object



429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
# File 'app/models/page.rb', line 429

def update_field(field_name, value, user=nil, field_title = nil, version = 0)
  old_value = load_field(field_name,version)
  return if old_value && value==old_value.value

  if version == 0
    ActiveRecord::Base.connection.execute("update page_contents set version = version + 1 where page_id = #{self.id} and field_name = '#{field_name}' and version >= 0") 
    field = PageContent.new
    field.system_id = self.system_id
    field.page_id = self.id
    field.version = 0
    field.field_name = field_name
  else
    field = PageContent.where(:page_id=>self.id, :version=>version, :field_name=>field_name).first
    if version==-2 && field==nil
      field = PageContent.new(:system_id=>self.system_id, :page_id=>self.id, :version=>version, :field_name=>field_name)
    end
  end
  field.value = value
  field.user_id = user.id if user
  field.save
  PageHistory.record(self,  user ? user.id : 0, "Updated#{version==-1 ? ' Draft' : ''} content", "'#{field_title}' changed", false, field.id) if version>=-1

end