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
161
162
163
|
require 'acts-as-taggable-on'
require 'seo_meta'
module Refinery
module Blog
class Post < ActiveRecord::Base
translates :title, :body, :custom_url, :custom_teaser, :slug, :include => :seo_meta
extend FriendlyId
friendly_id :friendly_id_source, :use => [:slugged, :globalize]
is_seo_meta if self.table_exists?
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
acts_as_taggable
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]}
attr_accessible :title, :body, :custom_teaser, :tag_list, :draft, :published_at, :custom_url, :author
attr_accessible :browser_title, :meta_description, :user_id, :category_ids
attr_accessible :source_url, :source_url_title
attr_accessor :locale
class Translation
is_seo_meta
attr_accessible :browser_title, :meta_description, :locale
end
# Delegate SEO Attributes to globalize3 translation
seo_fields = ::SeoMeta.attributes.keys.map{|a| [a, :"#{a}="]}.flatten
delegate(*(seo_fields << {:to => :translation}))
before_save do |m|
m.translation.globalized_model = self
m.translation.save if m.translation.new_record?
end
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?
find_by_slug(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 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
|