1
2
3
4
5
6 import datetime
7
8 from moap.util import log
9
10
11
12
13
14
16 """
17 Convert the given list of L{moap.doap.doap.Doap} objects to an RSS feed.
18 Caller should handle import errors for missing template languages.
19
20 @type doaps: list of L{moap.doap.doap.Doap}
21 @type template: str
22 @type templateType: str
23 @param templateType: cheetah or genshi
24
25 @rtype: str
26 """
27 projects = [d.getProject() for d in doaps]
28 log.debug("rss", "Generating RSS feed for %d projects", len(projects))
29
30 if not templateType:
31 templateType = "genshi"
32
33 f = templateType + '_toRss'
34
35 if not f in globals().keys():
36 raise NotImplementedError, "No support for templates of type %s" % \
37 templateType
38
39 return globals()[f](projects, template)
40
42 """
43 Convert Doap's 'created' format for a date to RSS's 'pubDate' format.
44 """
45 year = int(created[0:4])
46 month = int(created[5:7])
47 day = int(created[8:10])
48 date = datetime.datetime(year, month, day)
49 pubDate = date.strftime("%a, %d %b %Y 00:00:00 +0000")
50 return pubDate
51
52
53
54 CHEETAH_TEMPLATE = """<rss version="2.0">
55 <channel>
56 #set $names = ", ".join([p.name for p in $projects])
57 <title>Release feed for $names</title>
58 <description>Release feed for $names</description>
59 <link>$projects[0].homepage</link>
60 <language>en</language>
61
62 #for $project in $projects
63 #for $release in $project.release
64 #set $v = $release.version
65 <item>
66 <title>$project.name $v.revision '$v.name' released</title>
67 <guid isPermaLink="false">release-$project.shortname-$v.revision</guid>
68 <link>$project.homepage</link>
69 <pubDate>$createdToPubDate($v.created)</pubDate>
70 <description>
71 $v.description
72
73 For more information, visit
74 <A HREF="$project.homepage">the project homepage</A>
75 </description>
76 </item>
77 #end for
78 #end for
79
80 </channel>
81 </rss>
82 """
83
85 import Cheetah.Template
86
87 if not template:
88 template = CHEETAH_TEMPLATE
89
90 t = Cheetah.Template.Template(template, searchList=[
91 {
92 'projects': projects,
93 'createdToPubDate': createdToPubDate
94 }])
95 return str(t)
96
97 GENSHI_TEMPLATE = """<rss version="2.0"
98 xmlns:py="http://genshi.edgewall.org/">
99 <channel>
100 <title>Release feed for ${projects[0].name}</title>
101 <description>Release feed for ${projects[0].name}</description>
102 <link>${projects[0].homepage}</link>
103 <language>en</language>
104
105 <py:for each="project in projects">
106 <item py:for="release in project.release">
107 <py:with vars="v=release.version;
108 n=v.name;
109 ">
110 <title>${project.name} ${v.revision} '${v.name}' released</title>
111 <guid isPermaLink="false">release-${project.shortname}-${v.revision}</guid>
112 <link>${project.homepage}</link>
113 <pubDate>${createdToPubDate(v.created)}</pubDate>
114 <description>
115 ${v.description}
116
117 For more information, visit
118 <A HREF="${project.homepage}">the project homepage</A>
119 </description>
120 </py:with>
121 </item>
122 </py:for>
123
124 </channel>
125 </rss>
126 """
127
137