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
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.to_html)
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