root/eridanus/feeds.py

Revision 118, 2.4 kB (checked in by Jonathan Jacobs <korpse@…>, 2 years ago)

Some entry.py API changes.
Mostly to make the importing/exporting process easier.

Line 
1from nevow.rend import Page
2from nevow.inevow import IRequest
3
4from eridanus.atom import tostring, Feed, Entry, Link, Author, Content, E
5
6
7class FeedPage(Page):
8    maxItems = 50
9    feedId = None
10
11    def __init__(self):
12        super(FeedPage, self).__init__()
13
14    def getFeed(self):
15        raise NotImplementedError()
16
17    def renderHTTP(self, ctx):
18        req = IRequest(ctx)
19        req.setHeader('Content-Type', 'application/atom+xml')
20        data = tostring(self.getFeed().serialize())
21        req.write(data)
22        return ''
23
24
25class ChannelFeed(FeedPage):
26    feedId = 'http://linkdb.slipgate.za.net/'
27
28    def __init__(self, manager, **kw):
29        super(ChannelFeed, self).__init__(**kw)
30        self.manager = manager
31
32    def entryContent(self, entry):
33        initialComment = entry.initialComment
34        if initialComment is not None:
35            initialComment = E('span')[u' \u2013 \u201c%s\u201d' % (entry.initialComment.comment,)]
36
37        comments = entry.comments
38        if comments is not None:
39            comments = E('ul')[
40                [E('li')[u'\u201c%s\u201d \u2013 %s' % (c.comment, c.nick)] for c in comments]]
41
42        network = self.manager.config.service.serviceID
43        channel = entry.channel.strip('#')
44        href = '/Eridanus/%s/%s/%s' % (network, channel, entry.eid)
45
46        return E('div', xmlns='http://www.w3.org/1999/xhtml')[
47            E('a', href=href)['#%s' % (entry.eid,)],
48            E('span')[u': Posted by %s.' % (entry.nick,)],
49            initialComment,
50            comments]
51
52
53    def entryFromEntry(self, entry):
54        content = self.entryContent(entry)
55        return Entry(id=unicode(entry.eid),
56                     title=entry.displayTitle,
57                     updated=entry.modified,
58                     links=[Link(rel='alternate', href=entry.url)],
59                     authors=[Author(name=entry.nick)],
60                     content=Content(content, type='xhtml'))
61
62    def getFeed(self):
63        entries = list(self.manager.getEntries(limit=self.maxItems))
64        atomEntries = (self.entryFromEntry(e) for e in entries)
65
66        title = u'%s links' % (self.manager.channel,)
67        href = '/Eridanus/feeds/%s' % (self.manager.channel.strip('#'),)
68        return Feed(id=self.feedId,
69                    title=title,
70                    updated=entries[0].modified,
71                    links=[Link(rel='self', href=href)],
72                    entries=atomEntries)
Note: See TracBrowser for help on using the browser.