rss_feed.rb
3.29 KB
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
class RssFeed < Article
# i dont know why before filter dont work here
def initialize(*args)
super(*args)
self.advertise = false
end
# store setting in body
serialize :body, Hash
def body
self[:body] ||= {}
end
alias :settings :body
# The maximum number of articles to be displayed in the RSS feed. Default: 10
def limit
settings[:limit] || 10
end
def limit=(value)
#UPGRADE Leandro: I add this line to save the serialize attribute
self.body_will_change!
settings[:limit] = value
end
# FIXME this should be validates_numericality_of, but Rails 2.0.2 does not
# support validates_numericality_of with virtual attributes
validates_format_of :limit, :with => /^\d+$/, :if => :limit
# determinates what to include in the feed. Possible values are +:all+
# (include everything from the profile) and :parent_and_children (include
# only articles that are siblings of the feed).
#
# The feed itself is never included.
def include
settings[:include]
end
def include=(value)
settings[:include] = value
end
validates_inclusion_of :include, :in => [ 'all', 'parent_and_children' ], :if => :include
# determinates what to include in the feed as items' description. Possible
# values are +:body+ (default) and +:abstract+.
def feed_item_description
settings[:feed_item_description]
end
def feed_item_description=(value)
settings[:feed_item_description] = value
end
validates_inclusion_of :feed_item_description, :in => [ 'body', 'abstract' ], :if => :feed_item_description
# TODO
def to_html(options = {})
end
# RSS feeds have type =text/xml=.
def mime_type
'text/xml'
end
include ActionController::UrlWriter
def fetch_articles
if parent && parent.blog?
return parent.posts.find(:all, :conditions => ['published = ?', true], :limit => self.limit, :order => 'id desc')
end
articles =
if (self.include == 'parent_and_children') && self.parent
self.parent.map_traversal
else
profile.recent_documents(self.limit)
end
end
def data
articles = fetch_articles
result = ""
xml = Builder::XmlMarkup.new(:target => result)
xml.instruct! :xml, :version=>"1.0"
xml.rss(:version=>"2.0") do
xml.channel do
xml.title(_("%s's RSS feed") % (self.profile.name))
xml.link(url_for(self.profile.url))
xml.description(_("%s's content published at %s") % [self.profile.name, self.profile.environment.name])
xml.language("pt_BR")
for article in articles
unless self == article
xml.item do
xml.title(article.name)
if self.feed_item_description == 'body'
xml.description(article.body)
else
xml.description(article.abstract)
end
# rfc822
xml.pubDate(article.created_at.rfc2822)
# link to article
xml.link(url_for(article.url))
xml.guid(url_for(article.url))
end
end
end
end
end
result
end
def self.short_description
_('RSS Feed')
end
def self.description
_('Provides a news feed of your more recent articles.')
end
def icon_name
'rss-feed'
end
def can_display_hits?
false
end
end