1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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
|
require 'acts-as-taggable-on'
require 'seo_meta'
module Refinery
module Blog
class Post < ActiveRecord::Base
extend FriendlyId
translates :title, :body, :custom_url, :custom_teaser, :slug, :include => :seo_meta
friendly_id :friendly_id_source, :use => [:slugged, :globalize]
is_seo_meta
acts_as_taggable
belongs_to :author, proc { readonly(true) }, :class_name => Refinery::Blog.user_class.to_s, :foreign_key => :user_id
has_many :comments, :dependent => :destroy, :foreign_key => :blog_post_id
has_many :categorizations, :dependent => :destroy, :foreign_key => :blog_post_id
has_many :categories, :through => :categorizations, :source => :blog_category
validates :title, :presence => true, :uniqueness => true
validates :body, :presence => true
validates :published_at, :author, :presence => true
validates :source_url, :url => { :if => 'Refinery::Blog.validate_source_url',
:update => true,
:allow_nil => true,
:allow_blank => true,
:verify => [:resolve_redirects]}
class Translation
is_seo_meta
end
# If custom_url or title changes tell friendly_id to regenerate slug when
# saving record
def should_generate_new_friendly_id?
custom_url_changed? || title_changed?
end
# Delegate SEO Attributes to globalize translation
seo_fields = ::SeoMeta.attributes.keys.map{|a| [a, :"#{a}="]}.flatten
delegate(*(seo_fields << {:to => :translation}))
self.per_page = Refinery::Blog.posts_per_page
def next
self.class.next(self)
end
def prev
self.class.previous(self)
end
def live?
!draft && published_at <= Time.now
end
def friendly_id_source
custom_url.presence || title
end
class << self
# Wrap up the logic of finding the pages based on the translations table.
def with_globalize(conditions = {})
conditions = {:locale => ::Globalize.locale}.merge(conditions)
globalized_conditions = {}
conditions.keys.each do |key|
if (translated_attribute_names.map(&:to_s) | %w(locale)).include?(key.to_s)
globalized_conditions["#{self.translation_class.table_name}.#{key}"] = conditions.delete(key)
end
end
# A join implies readonly which we don't really want.
where(conditions).joins(:translations).where(globalized_conditions)
.readonly(false)
end
def find_by_slug_or_id(slug_or_id)
if slug_or_id.friendly_id?
friendly.find(slug_or_id)
else
find(slug_or_id)
end
end
def by_month(date)
newest_first.where(:published_at => date.beginning_of_month..date.end_of_month)
end
def by_year(date)
newest_first.where(:published_at => date.beginning_of_year..date.end_of_year).with_globalize
end
def by_title(title)
joins(:translations).find_by(:title => title)
end
def newest_first
order("published_at DESC")
end
def published_dates_older_than(date)
newest_first.published_before(date).select(:published_at).map(&:published_at)
end
def recent(count)
newest_first.live.limit(count)
end
def popular(count)
order("access_count DESC").limit(count).with_globalize
end
def previous(item)
newest_first.published_before(item.published_at).first
end
def uncategorized
newest_first.live.includes(:categories).where(
Refinery::Blog::Categorization.table_name => { :blog_category_id => nil }
)
end
def next(current_record)
where(arel_table[:published_at].gt(current_record.published_at))
.where(:draft => false)
.order('published_at ASC').with_globalize.first
end
def published_before(date=Time.now)
where(arel_table[:published_at].lt(date))
.where(:draft => false)
.with_globalize
end
alias_method :live, :published_before
def comments_allowed?
Refinery::Setting.find_or_set(:comments_allowed, true, :scoping => 'blog')
end
def teasers_enabled?
Refinery::Setting.find_or_set(:teasers_enabled, true, :scoping => 'blog')
end
def teaser_enabled_toggle!
currently = Refinery::Setting.find_or_set(:teasers_enabled, true, :scoping => 'blog')
Refinery::Setting.set(:teasers_enabled, :value => !currently, :scoping => 'blog')
end
end
module ShareThis
def self.enabled?
Refinery::Blog.share_this_key != "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
end
end
end
end
end
|