Package moap :: Package doap :: Module rss
[hide private]
[frames] | no frames]

Source Code for Module moap.doap.rss

  1  # -*- Mode: Python; test-case-name: moap.test.test_doap_doap -*- 
  2  # vi:si:et:sw=4:sts=4:ts=4 
  3   
  4  # rss templating using cheetah/genshi to output RSS feeds of releases 
  5   
  6  import datetime 
  7   
  8  from moap.util import log 
  9   
 10  # the template gets passed 'projects', which contains the project from 
 11  # each doap object. 
 12  # FIXME: maybe we want to change to items/entries, where they are sorted, 
 13  # and contain the doap project they belong to ? 
 14   
15 -def doapsToRss(doaps, template=None, templateType=None):
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
41 -def createdToPubDate(created):
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 # template language specific templates/handlers 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 &lt;A HREF="$project.homepage"&gt;the project homepage&lt;/A&gt; 75 </description> 76 </item> 77 #end for 78 #end for 79 80 </channel> 81 </rss> 82 """ 83
84 -def cheetah_toRss(projects, template):
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 &lt;A HREF="${project.homepage}"&gt;the project homepage&lt;/A&gt; 119 </description> 120 </py:with> 121 </item> 122 </py:for> 123 124 </channel> 125 </rss> 126 """ 127
128 -def genshi_toRss(projects, template):
129 import genshi.template 130 131 if not template: 132 template = GENSHI_TEMPLATE 133 134 t = genshi.template.MarkupTemplate(template) 135 s = t.generate(projects=projects, createdToPubDate=createdToPubDate) 136 return str(s)
137